https://juejin.im/post/5cb98606f265da0356322e74

三件套

如果我们要单独配置webpack,三件套是必须要得:

  • clean-webpack-plugin(清除旧的打包文件)
  • html-webpack-plugin(引入模板文件,自动导入)
  • webpack-dev-server(自动热更新)

    由于常见,我简单讲下配置,想了解详情配置,可去webpack查看

原ts项目的简单配置:

  1. const path = require('path')
  2. const HtmlWebpackPlugin = require('html-webpack-plugin')
  3. const {CleanWebpackPlugin} = require('clean-webpack-plugin')
  4. module.exports = {
  5. entry: "./src/main.ts",
  6. output:{
  7. path: path.resolve(__dirname, 'dist'),
  8. filename: 'main.js' //主意这里最终的输出必须是js
  9. },
  10. // webpack-dev-server插件,最后打入内存
  11. devServer: {
  12. contentBase: './dist',
  13. open: true
  14. },
  15. resolve: {
  16. "extensions": ['.ts', '.js', '.json']
  17. },
  18. module: {
  19. rules: [
  20. {
  21. test: /\.css$/, //正则配置
  22. use: ['style-loader', 'css-loader'],// 先执行css-loader, 在执行styleloader
  23. exclude: [
  24. path.resolve(__dirname, 'src/components')
  25. ]
  26. },
  27. //局部处理
  28. {
  29. test: /\.css$/, //正则配置
  30. use: ['style-loader', {
  31. loader: 'css-loader',
  32. options: {
  33. modules:{
  34. // localIdentName: '[path][name]__[local]--[hash:base64:5]' //官方
  35. localIdentName: 'kubor-[name]__[local]--[hash:base64:5]'
  36. }
  37. }
  38. }],// 先执行css-loader, 在执行styleloader
  39. include: [
  40. path.resolve(__dirname, 'src/components')
  41. ]
  42. },
  43. {
  44. test: /\.(eot|woff2|woff|ttf|svg)$/,
  45. use: ['file-loader']
  46. },
  47. {
  48. test:/\.ts$/,
  49. use: ['ts-loader'],
  50. exclude: /node_modules/ //忽略这里面的文件
  51. }
  52. ]
  53. },
  54. plugins: [
  55. new HtmlWebpackPlugin({
  56. template: './src/index.html' //引入模板文件,自动导入
  57. }),
  58. new CleanWebpackPlugin() //每次清除无效文件
  59. ],
  60. mode: "development"
  61. }

mini-css-extract-plugin

webpack 4.0以前,我们通过extract-text-webpack-plugin插件,把css样式从js文件中提取到单独的css文件中
image.png
webpack 4.0以后,官方推荐使用mini-css-extract-plugin插件来打包css文件(从css文件中提取css代码到单独的文件中,对css代码进行代码压缩等)

之前我有个单独的项目(自定义简历,线上PDF下载, 可静态部署,更新), 近期做了webpack3升级到4了,相应的插件也做了优化更新
image.png

chainWebpack

Vue CLI 内部的 webpack 配置是通过 webpack-chain维护的。这个库提供了一个 webpack 原始配置的上层抽象,使其可以定义具名的 loader 规则和具名插件,并有机会在后期进入这些规则并对它们的选项进行修改。

  1. // vue.config.js
  2. module.exports = {
  3. chainWebpack: config => {
  4. //添加一个路径别名 假设有在assets/img/menu/目录下有十张图片,如果全路径require("/assets/img/menu/img1.png")
  5. //去引入在不同的层级下实在是太不方便了,这时候向下方一样定义一个路劲别名就很实用了
  6. config.resolve.alias
  7. //添加多个别名支持链式调用
  8. .set("assets", path.join(__dirname, "/src/assets"))
  9. .set("img", path.join(__dirname, "/src/assets/img/menu"))
  10. //引入图片时只需require("img/img1.png");即可
  11. }
  12. }

最小化js文件

  1. config.optimization.minimize(true);

image-webpack-loader

  1. config.module
  2. .rule('images')
  3. .use('image-webpack-loader')
  4. .loader('image-webpack-loader')
  5. .options({
  6. bypassOnDebug: true
  7. })
  8. .end()

tree shaking

新的 webpack 4 正式版本,扩展了这个检测能力,通过 package.json"sideEffects" 属性作为标记,向 compiler 提供提示,表明项目中的哪些文件是 “pure(纯的 ES2015 模块)”,由此可以安全地删除文件中未使用的部分。