webpack

webpack 进阶用法

2020-12-03  本文已影响0人  阿畅_

自动清除构建目录

npm i clean-webpack-plugin  -D
plugins: [
  new CleanWebpackPlugin()
]

CSS 自动补全前缀信息

npm i postcss-loader autoprefixer -D
module: {
    rules: [
        {
            test: /.js$/,
            use: 'babel-loader'
        },
        {
            test: /.css$/,
            use: [
                'style-loader',
                'css-loader',
                 {
                  loader: 'postcss-loader',
                  options: {
                  plugins: () => [
                      requeire('autoprefixer')({
                     // 需要兼容的版本 某个浏览器的最近两个版本,使用大于 1%,ios 7 以上版本
                      browers: ['lase 2 version', '>1%', 'ios 7']
                   })
                  ]  
                 }
                }
            ]
        }
    ]
}

CSS 自动做 px 转 rem

npm i px2rem-loader -D
npm i lib-flexible -S
{
  test: /.css$/,
  use: [
    'style-loader',
    'css-loader',
    {
      loader: 'postcss-loader',
      options: {
        plugins: () => [
          requeire('autoprefixer')({
            // 需要兼容的版本 某个浏览器的最近两个版本,使用大于 1%,ios 7 以上版本
            browers: ['lase 2 version', '>1%', 'ios 7']
          })
        ] 
      }
    },
    {
      loader: 'px2rem-loader',
      options: {
        // rem 相对于 px 的转换单位, 1 rem = 75 适合 750视觉稿
        remUnit: 75,
        // px 转换成 rem 小数点的个数
        remPrecision: 8
      }
    }
  ]
}

资源内联

内联的意义

HTML 和 JS 内联

CSS 内联

多页面打包

原始的做法

  module.exports = {
    entry: {
      index: './src/index.html',
      main: './src/main.html'
    }
  }

动态获取 entry 和 设置 html-webpack-plugin

npm i glob -D 
const setMPA = () => {
  const entry = {}
  const HtmlWebpackPlugins = []
  // 获取文件地址
  const entryFiles = glob.sync(path.join(__dirname, './src/*/index.js'))
  Object.keys(entryFiles).map((i) => {
    const entryFile = entryFiles[i]
    // 匹配文件名称
    const matchName = entryFile.match(/src\/(.*)\/index\.js/)
    const patchName = matchName && matchName[1]

    entry[patchName] = entryFile
    HtmlWebpackPlugins.push(
      new HtmlWebpackPlugin({
        // 模板 所在的位置
        template: path.join(__dirname, `src/${patchName}/index.html`),
        // 指定打包后的文件名称
        filename: `${patchName}.html`,
        // 声明 HTML 使用什么 chunks
        chunks: [patchName],
        // 把引入的 js 或 css 自动注入
        inject: true,
        minify: {
          html5: true,
          collapseWhitespace: true,
          preserveLineBreaks: false,
          minifyCSS: true,
          minifyJS: true,
          removeComments: false
        }
      })
    )
  })
  return {
    entry,
    HtmlWebpackPlugins
  }
}

module.exports = {
  plugins: [
    new OptimizeCssAssetsWebpackPlugin({
      assetNameEegExp: /\.css$/g,
      cssProcessor: require('cssnano')
    }),
    new CleanWebpackPlugin() 
  ].concat(HtmlWebpackPlugins)
}

source map

作用

关键字

具体配置参数选项

提取公共资源

使用 cdn 的方式引入

npm i html-webpack-external-plugin -D
plugins: [
  // 使用 cdn 抽分离文件
  new HtmlWebpackExternalsPlugins({
    externals: [
      {
        module: 'react',
        entry: 'https://cdn.bootcdn.net/ajax/libs/react/16.9.0/cjs/react.production.min.js',
        global: 'React'
      }
    ]
  }),
]

// 然后需要在 .html 文件中引入 cdn 文件
<script src="https://cdn.bootcdn.net/ajax/libs/react/16.9.0/cjs/react.production.min.js"></script>

SplitChunksPlugin 进行公共脚本分离

optimization: {
  splitChunks: {
    // 分离公共的脚本
    cacheGroups: {
      commons: {
        test: /(react|react-dom)/,
        // 打包后的文件名,需要在  HtmlWebpackPlugin 的 chunks 中加入设置的文件名称
        name: 'vendors',
        chunks: 'all'
      }
    },
  }
}
optimization: {
  splitChunks: {
    minSize: 100, // 待分离文件的代码,如果是 0 就是有引入便分割,> 100 k 才会分离
    cacheGroups: {
      commons: {
        // 打包后的文件名,需要在  HtmlWebpackPlugin 中的 chunks 加入这个文件名称
        name: 'commons',
        chunks: 'all',
        miniChunks: 2, //至少引入两次才会被分离 和 minSize
      }
    }
  }
}

minSize 和 miniChunks 是并行的,必须两个条件都要满足

tree shaking

概念

使用

要求

什么情况下会被擦出掉

  1. 代码不会被执行,不可到达
if(false) { 
  console.log('不会被执行')
}
  1. 代码执行的结果不会被用到
  2. 代码只会影响死变量(只写不读)

Tree-shaking 原理

ES6 引入模块都是常量而不是变量

上一篇 下一篇

猜你喜欢

热点阅读