简介

Webpack 就不介绍了,前端工程化大部分人用它,本文主要从应用的角度介绍 Webpack 在日常开发中,最常用的配置是什么,让大家无压力看懂大部分项目的配置。

准备

先初始化 package.json,默认回车即可,安装好 webpack 和 webpack-cli

  1. npm init -y
  2. npm install webpack webpack-cli -D

在当前目录下创建 webpack.config.js 文件,这是 webpack 指定的默认配置文件,可以自己配置

  1. // package.json
  2. {
  3. "scripts": {
  4. "test": "echo \"Error: no test specified\" && exit 1",
  5. // webpack.config.js 为配置文件路径
  6. "build": "webpack --config webpack.config.js",
  7. }
  8. }

通过终端即可运行打包

  1. npm run build

1. HTML 配置

HTML 需要配置的不多,一般使用插件 html-webpack-plugin 是自动创建 HTML 模板,多页面打包

  1. const path = require('path');
  2. const HtmlWebpackPlugin = require('html-webpack-plugin'); // html 插件
  3. export default {
  4. plugins: [
  5. new HtmlWebpackPlugin({
  6. template: path.join(__dirname, `${filepath}/index.html`), // 模板位置
  7. filename: `${filename}.html`, // 名字
  8. chunks: ['vendors', 'common'], // 引入的 chunks
  9. inject: true,
  10. minify: {
  11. html5: true, // 页面是否压缩
  12. collapseWhitespace: true, // 是否去空格
  13. preserveLineBreacks: false, // 是否去换行
  14. minifyCSS: true, // 是否压缩内嵌 css
  15. minifyJS: true, // 是否压缩内嵌 js
  16. removeComments: false, // 是否去注释
  17. },
  18. })
  19. ]
  20. }

2. CSS 配置

Webpack 只能解析 JavaScript 和 JSON,为了能让 Webpack 识别 CSS,只能通过配置 Loader 来完成;但要压缩和将 CSS 单独打包出来,需要使用 optimize-css-assets-webpack-plugin 和 mini-css-extract-plugin 插件分别压缩和外联

  1. // css 外联插件
  2. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  3. // css 压缩插件
  4. const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
  5. export default {
  6. module:{
  7. rules: [ // loader 规则配置
  8. {
  9. test: /\.css$/, // 匹配 CSS 文件
  10. use: [
  11. MiniCssExtractPlugin.loader,
  12. // 'style-loader',
  13. 'css-loader',
  14. ],
  15. },
  16. {
  17. test: /\.less$/, // 匹配 Less 文件, 从右往左解析
  18. use: [ //
  19. MiniCssExtractPlugin.loader, // 外联 css 文件, 即 <link />
  20. // 'style-loader', // 内嵌样式 即 <style/>
  21. 'css-loader',
  22. 'less-loader',
  23. 'postcss-loader', // css 优化插件, 自动补全浏览器前缀
  24. ],
  25. },
  26. ]
  27. },
  28. plugins: [
  29. new MiniCssExtractPlugin({
  30. filename: '[name]_[contenthash:16].css', // 哈希命名 contenthash, 内容改变才重新打包
  31. }),
  32. new OptimizeCssAssetsWebpackPlugin({
  33. assetNameRegExp: /\.css$/g,
  34. cssProcessor: require('cssnano'), // 借助 cssnano 压缩 css
  35. })
  36. ]
  37. }

postcss 包需要在根目录创建 postcss.config.js 配置文件,引入自动前缀包

  1. module.exports = {
  2. plugins: [
  3. require('autoprefixer')
  4. ]
  5. }

3. 图片、文字配置

和 CSS 类似,图片和文字也需要专门的插件来处理

  1. export default {
  2. module:{
  3. rules: [ // loader 规则配置
  4. // 图片可以用 file-loader 或者 url-loader 压缩
  5. { // 解析图片-1
  6. test: /\.(png|svg|jpg|gif)$/, // 匹配图片
  7. use: [{
  8. loader: 'url-loader',
  9. options: {
  10. limit: 10240 // 小于 10k 则转为 base64 编码
  11. }
  12. }]
  13. },
  14. { // 解析图片-2
  15. test: /\.(png|svg|jpg|gif)$/, // 匹配图片
  16. use: [{
  17. loader: 'file-loader',
  18. options: {
  19. name: '[name][hash:8].[ext]', // 哈希命名, 指定 8 位
  20. },
  21. }],
  22. },
  23. { // 解析文字
  24. test: /\.(woff|woff2|eot|ttf|otf)$/, // 匹配文字
  25. use: ['file-loader'],
  26. },
  27. ]
  28. }
  29. }

4. JavaScript 配置

Webpack 不支持处理 ES6 和 TypeScript 等语法,所以需要 babel 和 loader 转化,需要插件完成代码压缩混淆、代码分割、动态导入代码块等功能

  1. const webpack = require('webpack');
  2. module.exports = {
  3. module: {
  4. rules: [
  5. {
  6. test: /\.js$/, // 匹配 Js 文件
  7. use: [
  8. 'babel-loader', // 转化 es6
  9. // 'ts-loader',
  10. ]
  11. },
  12. ]
  13. },
  14. plugins: [
  15. new webpack.optimize.UglifyJsPlugin(), // production 模式自动开启
  16. ],
  17. optimization: {
  18. splitChunks: { // 切割代码块, 需要在 htmlWebpackPlugin 的 chunks 里面引入
  19. minSize: 0, // 包被分割打包的最小 size
  20. cacheGroups: {
  21. commons: {
  22. name: 'commons', // 代码块名称
  23. chunks: 'all', //
  24. minChunks: 2, // 包引用次数,达到即打包
  25. },
  26. },
  27. },
  28. },
  29. }

babel 配置一般在更目录创建 .babelrc 配置文件

  1. {
  2. "presets": [
  3. [
  4. "@babel/preset-env" // es6 转化 es5
  5. ]
  6. ],
  7. "plugins": [
  8. "@babel/plugin-syntax-dynamic-import", // import 异步动态导入代码块插件
  9. ]
  10. }

5. 常用其他配置

主要介绍一些常用开发配置和生产环境的配置,外加一些常用插件

  1. // 友好日志插件
  2. const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin');
  3. // 清理 dist 文件
  4. const { CleanWebpackPlugin } = require('clean-webpack-plugin');
  5. const webpack = require('webpack');
  6. module.exports = {
  7. /* 模式有 3 种, 会自动启用不同的插件
  8. * development 开发
  9. * - NamedChunksPlugin
  10. * - NamedModulesPlugin
  11. * production 生产
  12. * - FlagDependencyUsagePlugin
  13. * - FlagIncludedChunksPlugin
  14. * - ModuleConcatenationPlugin // 去模块化插件
  15. * - NoEmitOnErrorsPlugin
  16. * - OccurrenceOrderPlugin
  17. * - SideEffectsFlagPlugin
  18. * - UglifyJsPlugin // JavaScript 压缩丑化插件
  19. * none 无
  20. */
  21. mode: 'development',
  22. plugins: [
  23. new CleanWebpackPlugin(),
  24. new FriendlyErrorsWebpackPlugin(),
  25. new webpack.HotModuleReplacementPlugin(), // 热替换
  26. ],
  27. devServer: { // 开发服务器, 开发模式
  28. contentBase: './dist', // 资源地址
  29. hot: true, // 开启热更新
  30. stats: 'errors-only' //
  31. },
  32. /* 开发记录错误代码位置,用于开发模式
  33. * eval 打包后代码
  34. * source-map 打包前代码,
  35. * cheap-source-map 记录行
  36. * inline-source-map 内嵌入 js 文件内
  37. */
  38. devtool: 'source-map',
  39. stats: 'errors-only', // 日志状态, 配合日志插件
  40. }

依赖

以上配置所需依赖的 npm 包

  1. "@babel/core": "^7.4.5",
  2. "@babel/plugin-syntax-dynamic-import": "^7.2.0",
  3. "@babel/preset-env": "^7.4.5",
  4. "@babel/preset-react": "^7.0.0",
  5. "autoprefixer": "^9.6.1",
  6. "babel-loader": "^8.0.6",
  7. "clean-webpack-plugin": "^3.0.0",
  8. "css-loader": "^3.0.0",
  9. "cssnano": "^4.1.10",
  10. "file-loader": "^4.0.0",
  11. "friendly-errors-webpack-plugin": "^1.7.0",
  12. "html-webpack-externals-plugin": "^3.8.0",
  13. "html-webpack-plugin": "^3.2.0",
  14. "less": "^3.9.0",
  15. "less-loader": "^5.0.0",
  16. "mini-css-extract-plugin": "^0.7.0",
  17. "optimize-css-assets-webpack-plugin": "^5.0.3",
  18. "postcss-loader": "^3.0.0",
  19. "style-loader": "^0.23.1",
  20. "url-loader": "^2.0.1",
  21. "webpack": "^4.33.0",
  22. "webpack-cli": "^3.3.5",
  23. "webpack-dev-server": "^3.7.2"

参考资料