代码拆散
代码拆散办法有三种:
- 入口终点:应用 entry 配置手动地拆散代码。
- 避免反复:应用 SplitChunksPlugin 去重和拆散 chunk。
- 动静导入:通过模块中的内联函数调用来拆散代码。
动静导入(dynamic imports)
- import()
- require.ensure
预取/预加载模块(prefetch/preload module)
webpack v4.6.0+ 增加了预取和预加载的反对。
在申明 import 时,应用上面这些内置指令,能够让 webpack 输入 "resource hint(资源提醒)",来告知浏览器:
- prefetch(预取):未来某些导航下可能须要的资源
- preload(预加载):以后导航下可能须要资源
配置项重点详解
(1)mode: "pruduction"
- 启用 minification(代码压缩) 和 tree shaking (usedExports:true)
- 主动指定DefinePlugin:process.env.NODE_ENV === 'production'
(2)devtool
source map 简介
- 生产环境:source-map
- 开发环境:inline-source-map
(3)optimization
splitChunks
splitChunks: { chunks: 'all', // 提取公共模块 loadash // 将第三方库(library)(例如 lodash 或 react)提取到独自的 vendor chunk 文件中,是比拟举荐的做法 // 利用 client 的长效缓存机制,命中缓存来打消申请,并缩小向 server 获取资源,同时还能保障 client 代码和 server 代码版本统一。 cacheGroups: { vendor: { test: /[\\/]node_modules[\\/]/, name: 'vendors', chunks: 'all' } }},
runtimeChunk
runtimeChunk: 'single' // 提取疏导模板 将 runtime 代码拆分为一个独自的 chunk
(5)output
// filename: '[name].[contenthash].js', // content hash 内容变动才会变动filename: 'webpack-numbers.js', path: path.resolve(__dirname, 'dist'),// 裸露 library 这是库名称 import from 'webpackNumbers'library: 'webpackNumbers', libraryTarget: 'umd'
(6)plugins
HashedModuleIdsPlugin
const { HashedModuleIdsPlugin } = require('webpack');plugins: [ // 不会因模块减少和缩小导致的模块内容变动,减少长缓存命中机制 new HashedModuleIdsPlugin()],
BundleAnalyzerPlugin
剖析打包代码
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');plugins: [ new BundleAnalyzerPlugin()]