webpack笔记
什么是webpack❓
webpack本质是一个nodeJs的一个第三方模块包,用于打包代码,和各种文件。
- 现代javascript应用程序的静态模块打包器
- 为学vue开发环境做铺垫
大白话:webpack是一个压缩打包web项目的nodejs第三方模块包
官方解说:
webpack是一个开源的前端打包工具。webpack提供了前端开放缺乏的模块化开发方式,将各种静态资源视为模块,并从它生成优化过的代码。webpack可以从终端、或者更改 webpack.config.js 来 设置各项功能。要使用webpack前须先安装node.js。
webpack的优点:👍
webpack是以commonJS的形式来书写脚本滴,但对AMD/CMD的支持也很全面,方便旧项目进行代码迁移。
这样能被模块化的不仅仅是JS了。
开发便捷,能代替部分grunt/gulp的工作,比如打包,压缩混淆、图片转换base64等。
扩展性强,插件机制完善,特别是支持React热插拔(见react-hot-loader)的功能让人眼前一亮。
作用:🔧
将多个js文件打包生成最终一个压缩后的js文件,减少文件数量和体积,从而提升访问速度,可还可以打包任意类型文件。
webpack从读取配置到输出文件整个过程解析:
- 初始化参数:从配置文件和shell语句中读取与合并参数,得出最终的参数;
- 开始编译:用上一步得到的参数初始化Compiler对象,架子啊所有配置的插件,执行对象的run方法开始执行编译;
- 确定入口:根据配置中的entry找出所有的入口文件;
- 编译模块:从入口文件出发,调用所有配置的Loader对模块进行翻译,再找出该模块依赖的模块,再递归本步骤直到所有入口依赖的文件都进过了本步骤的处理;
- 完成模块编译:在经过第4步使用Loadder翻译完所有模块后,得到了每个模块被翻译的最终内容以及它们之间的依赖关系;
- 输出资源:根据入口和模块之间的依赖关系,组装成一个个包含多个模块的Chunk,再把每个Chunk转换成一个单独的文件加入到输出列表,这不是可以修改输出内容的最后机会;
- 输出完成:在确定好输出内容后,根据配置确定输出的路径和文件名,把文件内容写入到文件系统。
使用前置:📦
- 安装node.js
- 安装npm(node.js安装好后npm应该就可以使用了),也可以使用yarn代替
js代码里的模块导入/导出及文件的导入
在webpack里 万物 皆模块 📦
1. nodejs内置的导入/导出:
假设有两个js文件并且在同一目录下,一个是add.js、另一个是main.js,add.js里写了一个求和函数,main.js要用add.js里的求和函数。
方法:module.exports = 要暴露的数据
; require('要导入的数据的路径')
add.js内容:
1 | function add (a,b){ |
main.js内容:
1 | // 获取模块(解构赋值) |
2. ES6模块化导入/导出(企业常用)
使用方式同nodejs,只不过语法不同
注意⚠️:ES6模块化导入/导出要通过webpack打包后才能执行
方式一(默认方式导入导出)
1 | // 导出 |
导入导出的变量名可以不一样
方式二(多变量导入导出)
1 | // 导出 |
导入导出的变量名要一致
3. webpack里loader加载的文件导入:
需要在入口js文件里导入文件 import '文件相对路径及文件名'
代码文件导入: (css, less,js,sass,ejs……)
1 | // 例如导入css文件 |
资源文件导入: (图片,视频,字体……)
1 | // 例如导入图片文件 |
npm和yarn命令表
说明 | npm命令 | yran命令 |
---|---|---|
初始化包环境 | npm init | yarn init |
根据配置完善依赖包 | npm install | yarn install |
安装依赖包 | npm install/i (包名) | yarn add (包名) |
安装依赖包(版本) | npm install [包名]@[版本号] | yarn add [包名]@[版本号] |
卸载依赖包 | npm uninstall [包名] | yarn remove [包名] |
更新依赖包 | npm updata [包名] | yarn upgrade [包名] |
全局部署后缀 | –global | (无) |
安装到当前目录(后缀) | (默认) | -D |
发布/登陆/登出 | npm publish/login/logout | yarn publish/login/logout |
运行某个命令 | npm run/test | yarn run/test |
webpack打包命令 | npx webpack | yarn webpack |
基础使用操作(第三方包使用前置):📦
环境准备:
注意⚠️:要不全使用npm,要不全使用yarn,不然会出错(大神随意)。
- 初始化包环境:
npm init
或者yarn init
- 安装依赖包:
npm install webpack webpack-cli
或者yarn add webpack webpack-cli -D
webpack5之后的打包目录通常在项目根目录的src文件夹里边
入门-打包js文件:
操作流程
- 在项目根目录创建一个src文件夹
- 在src目录里创建add.js文件,里边写一些要用的方法,并且**对外暴露(导出)**里边的东西。
- 在src文件夹创建一个index.js文件,在里边导入add.js并使用导入的方法。(index.js作为默认入口文件)
- 在项目目录下打开终端输入打包命令
yarn webpack
或npx webpack
- 打包好的js文件默认输出到dist文件夹,名称为main.js
结论:
- 打包的东西都需要引入到 入口文件 里
- 被引入的东西都需要对外导出(暴露)
- 打包好的文件会生成到指定文件夹(默认为项目根目录的dist文件夹)
如何配置webpack打包
为什么要配置webpack:webpack5最新版的打包方式是不需要配置,但是由于项目用到的第三方包比较多,打包的文件类型也比较多,就不得不进行webpack的配置,且webpack的第三方包也是需要通过配置来引入使用的。
需要在项目根目录下新建一个webpack.config.js文件,接着就可以在里边编写配置啦。
内容:
1 | // 引入node内置的path模块(路径模块) |
面试常问:web执行顺序: 从右往左,从下往上
以上配置为所学内容的配置,其余配置请参考webpack中文文档
webpack中的loader和plugin
loader——英文翻译”载入程序”
载入程序,一般是些和网页相关的文件,如css,less,字体图标,图片,等等,一般情况下使用特定loader可以将这些文件打包压缩。
plugin——英文翻译”插件”
插件,一般是用于
webpack打包命令:
Npm:npx webpack
Yarn:yarn webpack
1.打包js文件
默认打包的就是js文件
凡是主入口文件导入的模块,都会被打包
通过配置webpack.config.js文件自定义入口文件及输出目录
在终端输入yarn webpack
或npx webpack
执行打包
2. html-webpack-plugin插件(打包html文件)
Html-webpack-plugin插件为html打包的插件
终端执行
npm install --save-dev html-webpack-plugin
或yarn add html-webpack-plugin -的
安装html-webpack-plugi插件在配置文件添加如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13// 添加路径模块
var path = require('path')
// 创建htmlwebpackplugin对象
var HtmlWebpackPlugin = require('html-webpack-plugin');
// 自定义html打包配置
var webpackConfig = {
entry: 'index.js', // 入口文件
output: {
path: path.resolve(__dirname, './dist'), // 保存目录
filename: 'index_bundle.js' // js保存文件名
},
plugins: [new HtmlWebpackPlugin()]
};当然你也可以直接在module.exports里添加如下两条就可以了
1
2var HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [new HtmlWebpackPlugin()]打包时会自动生成和public里的html模版文件名字一致的html文件。
打包
生词 | 翻译 |
---|---|
module | 模块 |
rules | 条例、规则 |
exports | 出口商品 |
entry | 入口 |
output | 输出 |
path | 路径 |
plugin | 插件 |
loader | 载入程序、装卸工 |
template | 模版 |
generator | 发生器、生产者 |
3.css文件打包
安装style-loader模块和css-loader模块
执行
yarn add style-loader css-loader -D
或者npm i --save-dev style-loader css-loader
添加配置
1
2
3
4
5
6
7
8
9
10module: {
// 一个具体的loader配置
rules: [{
// test里写正则表达式,用于判断文件名
test: /\.css$/i,
// use里写的是使用的loader(装卸)模块
use: ['style-loader','css-loader'],
// 执行顺序 从右到左,从下到上
}]
}在入口js文件里导入css文件 (不知道怎么导入往上翻)
1
import 'css文件路径'
执行打包命令
4.less文件打包
安装less、less-loader、css-loader、style-loader模块
1
2
3
4// npm 安装
npm install --save-dev less less-loader css-loader style-loader
// yarn 安装
yarn add less less-loader css-loader style-loader -D添加配置
1
2
3
4
5
6
7
8
9module: {
rules: [{
// test里写正则表达式,用于判断文件名
test: /\.less$/i,
// use里写的是使用的loader(装卸)模块
use: ['style-loader','css-loader','less-loader'],
// 执行顺序 从右到左,从下到上
}]
}在入口js文件里导入less文件 (不知道怎么导入往上翻)
1
import 'less文件路径'
执行打包命令
5.图片打包
添加配置
1
2
3
4
5
6
7
8
9// 配置loader
module: {
rules: [{
// test里写正则表达式,用于判断文件名
test: /\.(png|jpeg|jpg|gif)$/i,
// use里写的是使用的loader(装卸)模块
type: 'asset'
}]
}在入口js文件里导入图片文件 (不知道怎么导入往上翻)
1
2import imgSrc from '图片文件路径'
// 导入的imgSrc为一个图片的路径,可用于图片元素标签的src属性。执行打包命令
6.字体图标打包
将字体图标放到项目目录里的font文件夹(位置可以自己定)
添加配置
1
2
3
4
5
6
7
8
9
10
11
12
13// 配置loader
module: {
rules: [{
// test里写正则表达式,用于判断文件名
test: /\.(ent|svg|ttf|woff)$/i,
// 类型为asset(资源)
type: 'asset/resource',
generator: {
// 输出文件到dist目录下的同样的文件名和后缀名
filename: 'font/[name].[ext]'
}
}]
}这里的[name]和[ext]分别为[文件名]和[文件后缀名]
在style样式或css文件里引用字体图标
1
2
3span{
font-family: icomoon
}执行打包命令
7.JS语法降级打包
下载安装加载器
yarn add babel-loader @babel/core
添加webpack.config.js配置
1
2
3
4
5
6
7
8
9
10
11
12
13module: {
rules: [{
// test里写正则表达式,用于判断文件名
test: /\.js$/i,
exclude:/(node_modules|bower_compinents)/,
use:{
loader: 'babel-loader',
options:{
presets:['@babel/preset-env']
}
}
}]
}执行打包命令