- webpack概述
- 入口起点(Entry Points)
- 输出(Output)
- 模块(Mode)
- 加载器(Loaders)
- 插件(Plugins)
- 配置(Configuration)
- 模块(Modules)
- 模块解析(Module Resolution)
- 依赖图表(Dependency Graph)
- 文件清单(Manifest)
- 构建目标(Targets)
- 模块热替换(Hot Module Replacement)
- 第二部分:配置
- 使用不同语言进行配置(Configuration Languages)
- 多种配置类型
- 入口和上下文(Entry and Context)
- 输出(Output)
- 模块(Module)
- 解析(Resolve)
- 插件(Plugins)
- 开发中 Server(DevServer)
- 开发工具(Devtool)
- 构建目标(Targets)
- Watch 和 WatchOptions
- 外部扩展(Externals)
- 性能(Performance)
- Node
- 统计(Stats)
- 其它选项(Other Options)
- 第三部分:API
- 命令行接口(CLI)
- 包含统计数据的文件(stats data)
- Node.js API
- 模块热替换(Hot Module Replacement)
- 加载器 API
- 模块方法(module methods)
- 模块变量(module variables)
- Plugin API
- compiler 钩子
- compilation 钩子
- resolver
- parser
- 第四部分:指南
- 安装
- 起步
- 管理资源
- 管理输出
- 开发
- 模块热替换
- Tree shaking
- 生产环境构建
- 代码拆分(Code Splitting)
- 懒加载(Lazy Loading)
- 缓存(Caching)
- 创建库 (Library)
- Shimming
- 渐进式网络应用程序
- TypeScript
- 迁移到新版本
- 使用环境变量
- 构建性能
- 内容安全策略
- 开发 - Vagrant
- 管理依赖
- Public Path(公共路径)
- 集成(Integrations)
- 第五部分:加载器
- babel-loader
- yaml-frontmatter-loader
- cache-loader
- coffee-loader
- coffee-redux-loader
- coverjs-loader
- css-loader
- exports-loader
- expose-loader
- extract-loader
- file-loader
- gzip-loader
- html-loader
- i18n-loader
- imports-loader
- istanbul-instrumenter-loader
- jshint-loader
- json-loader
- json5-loader
- less-loader
- bundle-loader
- multi-loader
- node-loader
- null-loader
- polymer-webpack-loader
- postcss-loader
- raw-loader
- react-proxy-loader
- restyle-loader
- sass-loader
- script-loader
- source-map-loader
- style-loader
- svg-inline-loader
- thread-loader
- transform-loader
- url-loader
- val-loader
- worker-loader
- mocha-loader
- 第六部分:插件
- AggressiveSplittingPlugin
- ZopfliWebpackPlugin
- BannerPlugin
- ClosureWebpackPlugin
- CommonsChunkPlugin
- ComponentWebpackPlugin
- CompressionWebpackPlugin
- ContextReplacementPlugin
- CopyWebpackPlugin
- DefinePlugin
- DllPlugin
- EnvironmentPlugin
- EvalSourceMapDevToolPlugin
- ExtractTextWebpackPlugin
- HashedModuleIdsPlugin
- HotModuleReplacementPlugin
- HtmlWebpackPlugin
- BabelMinifyWebpackPlugin
- IgnorePlugin
- LoaderOptionsPlugin
- MinChunkSizePlugin
- ModuleConcatenationPlugin
- NamedModulesPlugin
- NormalModuleReplacementPlugin
- NpmInstallWebpackPlugin
- PrefetchPlugin
- ProfilingPlugin
- ProvidePlugin
- SourceMapDevToolPlugin
- SplitChunksPlugin
- UglifyjsWebpackPlugin
- WatchIgnorePlugin
- I18nWebpackPlugin
构建性能
本指南包含一些改进构建/编译性能的实用技巧。
常规
无论你正在 /doc/webpack-guides-development 或构建 /doc/webpack-guides-production,以下做法应该帮助到你达到最佳。
保持版本最新
使用最新的 webpack 版本。我们会经常进行性能优化。 webpack 的最新稳定版本是:
保持最新的 Node.js 也能够保证性能。除此之外,保证你的包管理工具 (例如 npm
或者 yarn
) 为最新也能保证性能。较新的版本能够建立更高效的模块树以及提高解析速度。
Loaders
将 loaders 应用于最少数的必要模块中。而不是:
{
test: /\.js$/,
loader: "babel-loader"
}
使用 include
字段仅将 loader 模块应用在实际需要用其转换的位置中:
{
test: /\.js$/,
include: path.resolve(__dirname, "src"),
loader: "babel-loader"
}
Bootstrap
每个额外的 loader/plugin 都有启动时间。尽量少使用不同的工具。
解析
以下几步可以提供解析速度:
- 尽量减少
resolve.modules
,resolve.extensions
,resolve.mainFiles
,resolve.descriptionFiles
中类目的数量,因为他们会增加文件系统调用的次数。 - 如果你不使用 symlinks ,可以设置
resolve.symlinks: false
(例如npm link
或者yarn link
). - 如果你使用自定义解析 plugins ,并且没有指定 context 信息,可以设置
resolve.cacheWithContext: false
。
Dlls
使用 DllPlugin
将更改不频繁的代码进行单独编译。这将改善引用程序的编译速度,即使它增加了构建过程的复杂性。
Smaller = Faster
减少编译的整体大小,以提高构建性能。尽量保持 chunks 小巧。
- 使用 更少/更小 的库。
- 在多页面应用程序中使用
CommonsChunksPlugin
。 - 在多页面应用程序中以
async
模式使用CommonsChunksPlugin
。 - 移除不使用的代码。
- 只编译你当前正在开发部分的代码。
Worker Pool
thread-loader
可以将非常消耗资源的 loaders 转存到 worker pool 中。
W> 不要使用太多的 workers ,因为 Node.js 的 runtime 和 loader 有一定的启动开销。最小化 workers 和主进程间的模块传输。进程间通讯(IPC)是非常消耗资源的。
持久化缓存
使用 cache-loader
启用持久化缓存。使用 package.json
中的 "postinstall"
清除缓存目录。
自定义 plugins/loaders
这里不对它们配置的性能问题作过多赘述。
Development
下面步骤对于 /doc/webpack-guides-development 特别有用。
增量编译
使用 webpack 的监听模式。不要使用其他工具来监听你的文件和调用 webpack 。在监听模式下构建会记录时间戳并将信息传递给编译让缓存失效。
在某些设置中,监听会回退到轮询模式。有许多监听文件会导致 CPU 大量负载。在这些情况下,你可以使用 watchOptions.poll
来增加轮询的间隔。
在内存中编译
以下几个实用工具通过在内存中进行代码的编译和资源的提供,但并不写入磁盘来提高性能:
webpack-dev-server
webpack-hot-middleware
webpack-dev-middleware
Devtool
需要注意的是不同的 devtool
的设置,会导致不同的性能差异。
"eval"
具有最好的性能,但并不能帮助你转译代码。- 如果你能接受稍差一些的 mapping 质量,可以使用
cheap-source-map
选项来提高性能 - 使用
eval-source-map
配置进行增量编译。
=> 在大多数情况下,cheap-module-eval-source-map
是最好的选择。
避免在生产环境下才会用到的工具
某些实用工具, plugins 和 loaders 都只能在构建生产环境时才有用。例如,在开发时使用 UglifyJsPlugin
来压缩和修改代码是没有意义的。以下这些工具在开发中通常被排除在外:
UglifyJsPlugin
ExtractTextPlugin
[hash]
/[chunkhash]
AggressiveSplittingPlugin
AggressiveMergingPlugin
ModuleConcatenationPlugin
最小化入口 chunk
webpack 只会在文件系统中生成已经更新的 chunk 。对于某些配置选项(HMR, [name]
/[chunkhash]
in output.chunkFilename
, [hash]
)来说,除了更新的 chunks 无效之外,入口 chunk 也不会生效。
应当在生成入口 chunk 时,尽量减少入口 chunk 的体积,以提高性能。下述代码块将只提取包含 runtime 的 chunk ,其他 chunk 都作为子模块:
new CommonsChunkPlugin({
name: "manifest",
minChunks: Infinity
})
Production
以下步骤在 /doc/webpack-guides-production 中非常有用。
W> 不要为了非常小的性能增益,牺牲你应用程序的质量! 请注意,优化代码质量在大多数情况下比构建性能更重要。
多个编译时
当进行多个编译时,以下工具可以帮助到你:
parallel-webpack
: 它允许编译工作在 worker 池中进行。cache-loader
: 缓存可以在多个编译时之间共享。
Source Maps
Source maps 真的很消耗资源。你真的需要他们?
工具相关问题
下列工具存在某些可能会降低构建性能的问题。
Babel
- 项目中的 preset/plugins 数量最小化。
TypeScript
- 在单独的进程中使用
fork-ts-checker-webpack-plugin
进行类型检查。 - 配置 loaders 跳过类型检查。
- 使用
ts-loader
时,设置happyPackMode: true
/transpileOnly: true
。
Sass
node-sass
中有个来自 Node.js 线程池的阻塞线程的 bug。 当使用thread-loader
时,需要设置workerParallelJobs: 2
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论