webpack(四)

269 阅读1分钟
30.Webpack 多入口打包

多页应用程序

一个页面对应一个打包入口

公共部分单独提取

entry: {
  index: './src/index.js',
  album: './src/album.js'
},
output: {
  filename: '[name].bundle.js'
},
    
    
new HtmlWebpackPlugin({
  title: 'Multi Entry',
  template: './src/index.html',
  filename: 'index.html',
  chunks: ['index']  // 指定所使用的的bundle
}),
new HtmlWebpackPlugin({
  title: 'Multi Entry',
  template: './src/album.html',
  filename: 'album.html',
  chunks: ['album']
})
31.Webpack提取公共模块
optimization: {
  splitChunks: {
    // 自动提取所有公共模块到单独 bundle
    chunks: 'all'
  }
},
32.Webpack动态导入

按需加载

动态导入的模块会自动分包

const render = () => {
  const hash = window.location.hash || '#posts'

  const mainElement = document.querySelector('.main')

  mainElement.innerHTML = ''

  if (hash === '#posts') {
    import('./posts/posts').then(({ default: posts }) => {
      mainElement.appendChild(posts())
    })
  } else if (hash === '#album') {
    import('./album/album').then(({ default: album }) => {
      mainElement.appendChild(album())
    })
  }
}
33.Webpack魔法注释
import(/* webpackChunkName: 'components' */'./posts/posts').then(({ default: posts }) => {
   mainElement.appendChild(posts())
})
34.miniCssExtractPlugin

提取css到单个文件,超过150kb

// yarn add mini-css-extract-plugin --dev
const MiniCssExtractPlugin = require('mini-css-extract-plugin')

new MiniCssExtractPlugin()
rules: [
  {
    test: /.css$/,
    use: [
       // 'style-loader', // 将样式通过 style 标签注入
       MiniCssExtractPlugin.loader,
       'css-loader'
    ]
  }
]
35.Webpack OptimizeCssAssetsWebpackPlugin
// yarn add optimize-css-assets-webpack-plugin --dev
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')  // 压缩css
const TerserWebpackPlugin = require('terser-webpack-plugin')  // 压缩js
 
// minimize: true 开启的时候使用
optimization: {
  minimizer: [
    new TerserWebpackPlugin(),
    new OptimizeCssAssetsWebpackPlugin()
  ]
},
36.输出文件名(Hash)

生产模式下,文件名使用Hash

解决缓存问题

filename: '[name]-[hash].bundle.js'

filename: '[name]-[chunkhash].bundle.js'

filename: '[name]-[contenthash:8].bundle.js'