Webpack 是前端使用最为广泛的打包工具,可以大大提高工作效率。
简介
现在网页的功能越来越丰富,包含了很多复杂的 JavaScript 代码以及一堆的依赖包,为了简化开发复杂度,社区提供了很多好的实践方法:
- 模块化,将一些复杂功能抽象为基本模块,然后重复使用。
- 使用 TypeScript 类似更严格的语言进行开发,发布前再转换为 JavaScript 语言。
- 通过 SCSS、LESS 等 CSS 预处理器,同样使得更方便开发 CSS 。
在使用这些方案的同时,意味着维护起来更加麻烦,而 Webpack 提供了一种打包机制,可以更方便管理 JavaScript 项目。Webpack 会把项目当做一个整体,通过给定主文件开始找到项目所有依赖文件,最后打包成一个或多个 JavaScript 文件。
可以通过如下方式安装,包括了本地以及全局安装。
----- 本地使用
$ npm init -y
$ npm install webpack webpack-cli --save-dev
----- 全局安装
# npm install -g webpack
目前比较新的是 Webpack5 版本,依赖的 NodeJS 版本至少要 10.13.0
以上。
配置文件
有些项目管理很复杂,通过配置文件可以有效提高效率,这里在项目目录下创建文件 webpack.config.js
。
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist'),
},
mode: 'development',
};
然后可以通过 npx webpack --config webpack.config.js
执行,实际上,如果不指定配置文件,默认使用的就是该文件。为了更方便使用,可以修改 package.json
配置文件,增加如下内容。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack"
},
这样可以通过 npm run build
来执行了,即使后面再增加其它参数。
除了如上管理 JavaScript 依赖之外,还可以管理 CSS、图片等资源。
其它
常用插件
cross-env
运行跨平台设置和使用环境变量的脚本,例如 Windows 不支持NODE_ENV=dev
这种方式。speed-measure-webpack-plugin
可以用来分析打包耗时,包括每个plugin
和loader
的打包耗时,从而可以对耗时较长的部分进行针对性优化。html-webpack-plugin
将打包完的js
文件自动引入html
文件。webpack-dev-server
本地起一个http
服务,通过简单的配置还可指定其端口、热更新的开启等。babel-preset-react-app
用于支持JSX
语法,需要配置presets: ['react-app']
。
已知问题
当通过 mini-css-extract-plugin
处理 CSS 文件时,对应的 npm
版本为 10.2.4 ,对应 1.3.5
不会报错,而 1.6.2
就会报如下错误。
ERROR in ./src/index.css
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
Error: You forgot to add 'mini-css-extract-plugin' plugin (i.e. `{ plugins: [new MiniCssExtractPlugin()] }`), please read https://github.com/webpack-contrib/mini-css-extract-plugin#getting-started
at Object.pitch (/home/andy/Workspace/Servers/Bastion/web/node_modules/mini-css-extract-plugin/dist/loader.js:51:14)
@ ./src/index.tsx 5:0-21
ERROR in ./src/pages/hello/hello.css
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
Error: You forgot to add 'mini-css-extract-plugin' plugin (i.e. `{ plugins: [new MiniCssExtractPlugin()] }`), please read https://github.com/webpack-contrib/mini-css-extract-plugin#getting-started
at Object.pitch (/home/andy/Workspace/Servers/Bastion/web/node_modules/mini-css-extract-plugin/dist/loader.js:51:14)
@ ./src/pages/hello/index.tsx 26:0-21
@ ./src/App.tsx
@ ./src/index.tsx 6:0-24 7:132-135
使用 speed-measure-webpack-plugin
时,估计是版本比较老,会打印如下的 Warning 信息。
(node:207007) [DEP_WEBPACK_COMPILATION_NORMAL_MODULE_LOADER_HOOK] DeprecationWarning: Compilation.hooks.normalModuleLoader was moved to NormalModule.getCompilationHooks(compilation).loader
(Use `node --trace-deprecation ...` to show where the warning was created)
修改 webpack.config.js
配置文件,增加如下内容。
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
const smp = new SpeedMeasurePlugin();
module.exports = smp.wrap(config);
参考
- webpack.docschina.org 中文官方文档,可以查看其中指南、概念、API 等相关章节。