#1.什么是webpack?
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。当前,借助loader,webpack也可以处理非js的模块,如vue、sass、img、es6高级语法等等。
#2.前提说明
(1) 现在webpack已经更新到版本5,版本4与版本5的webpack是有所不同的;要是使用版本4的webpack,webpack-cli的版本需要是3版本的;
(2) 使用webpack,需要安装两个核心: webpack
和 webpack-cli
#3.打包命令
(1) 无webpack.config.js或未指定配置文件情况下:
-
webpack ./one.js
将 ./one.js 默认打包到 ./dist/main.js 中 -
webpack ./src
打包文件夹时会默认查找该文件下面的 index.js ,若找到则按照上面进行打包,找不到则报错 -
webpack ./src/one.js -o ./bundle/two.js
将 src/one.js 打包到 ./bundle/two.js 中
(2) 设置webpack.config.js文件的情况下:
-
webpack
执行该命令,会根据 webpack.config.js 配置的进行打包
(3) 指定配置项进行打包
-
webpack --config ./webpack.dev.js
使用 webpack.dev.js 配置文件进行打包
#4.配置 webpack.config.js
1. 入口(entry)
entry 属性指定打包的入口文件,可配置单个或多个;默认入口为 ./src/index.js
; 详见:https://www.webpackjs.com/concepts/entry-points/
module.exports = {
entry: './src/index.js'
}
2. 出口(output)
output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件;默认目录为 ./dist
,默认文件为 main.js
; 详见:https://www.webpackjs.com/concepts/output/
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.join(__dirname, 'bundle'),
filename: 'main.js'
}
}
3. 模式(mode)
设置打包的模式,可选值:development
、production
; 详见:https://www.webpackjs.com/concepts/mode/
module.exports = {
mode: 'development'
}
4. devtool
指定 source-map 的类型;
- none :不使用source-map;
- source-map :会在dist文件下生成一个bundle.js.map的文件;告诉你第几行第几列出错了;
- inline :不会独立生成一个map文件,会嵌到 bundle.js 文件中;
- cheap :① 只告诉你第几行出错,不会精确到列; ② 只会检查你写的业务代码的错误,不会检查 modules 和 loaders 中的错误;
- module :既检查你写的业务逻辑,也检查module 和 loaders的错误;
- eval : 速度最快的检查错误,但是不适合大型文件;
综上推荐:
- 开发模式下(development):cheap-module-eval-source-map
- 生产模式下(production):cheap-module-source-map
5. 插件(plugin)
(1) 插件是 webpack 的支柱功能,插件目的在于解决 loader 无法实现的其他事。
(2) 其实可以这样理解,对于打包,只需要webpack
这一个命令就好了;但是,一般情况下,我们都是边开发,边打包查看效果,那这样的话,手动执行打包效率就太低了。此时我们可以使用插件:webpack-dev-server
、html-webpack-plugin
等来提高开发效率。
(3) webpack在执行打包过程中,也是有一个生命周期的,不同的插件会在不同周期上面发挥作用。
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin'); //通过 npm 安装
module.exports = {
entry: './src/index.js',
output: {
path: path.join(__dirname, 'bundle'),
filename: 'main.js'
},
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
]
}
html-webpack-plugin
执行打包命令之后,会自动生成一个html文件,并导入打包后的js、css等文件;clean-webpack-plugin
执行打包命令之前,先清空存储打包文件的目录;通常与html-webpack-plugin一同使用。webpack-dev-server
开启一个服务器,根据配置文件自动执行打包、热更新等;打包后的js文件放在内存的根目录;
注意:
① webpack 4 启动服务器的命令为:webpack-dev-server
② webpack 5 启动服务器的命令为:webpack serve
6. 模块(module)
webpack除了能识别js语法之外,还能识别如下;除此之外,需要借助不同的loader来识别。
- ES2015 import 语句
- CommonJS require() 语句
- AMD define 和 require 语句
- css/sass/less 文件中的 @import 语句。
- 样式(url(...))或 HTML 文件(
<img src="">
)中的图片链接(image url)
7. loader
webpack自身能识别的内容并不多,其他不能识别的内容就需要借助不同的loader;loader 用于对模块的源代码进行转换。
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
path: path.join(__dirname, 'dist'),
filename: 'main.js'
},
module: {
rules: [
//配置打包css文件规则
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
}
}