功能一览
css/sass/less相关
插件
- cache-loader(放最后)
- thread-loader(它前面的loader用一个worker池)
- vue-style-loader(动态切换,它是style-loader在vue项目中的代替,它配置在sass、less模块中也会对它们产生的css处理,普通的
.scss文件和*.vue文件中的<style lang="scss">块都应用它) - mini-css-extract-plugin(动态切换)
- css-loader
- postcss-loader(要放在sass、less等后面调用)
sass-loader/less-loader(注意sass-loader需要依赖node-sass)
基本实现
css添加前缀,抽提与处理同步、异步的样式表,哈希标记
- 根据运行环境切换不同插件
-
图片,字体,媒体文件相关
插件
cache-loader
- thread-loader
- file-loader
url-loader(先使用它,如果超过设置的大小限制就调用file-loader)
基本实现
缓存
- 哈希标记
-
HTML相关
插件
html-webpack-plugin(主要使用它引入一些模板,当使用不同的模板时,也要加载不同的loader处理,还有就是,存在多入口时,要利用chunks属性一一标记,每个入口新建新插件)
基本实现
多入口
-
JS相关
插件
cache-loader(放在最后)
- babel全家桶:
- babel-loader将es6等高级语法转低级语法,注意只会转换语法,对全新api不转换,需借用垫片babel-polyfill
- @babel/core是babel的核心模块,编译器,提供转换的api
- babel/preset-env可以根据配置的目标浏览器或者运行环境将es5+的代码转换为es5,它要和前面两个结合用
babel/polyfill转化api,它的用法很奇怪,要在上面entry处,(后续版本已慢慢弃用)
例如:entry:[‘@babel/polyfill’,path.resolve(_dirname,’../src/index.js’)] 这样子使用
推荐:@babel/preset-env配置选项,useBuiltIns: ‘usage’ ,搭配core-js,在使用了新语法的js文件顶部,动态 按需引入core-js/modules里头的模块参考babel/runtime提供统一模块化的helper,减少其重复输出,减少打包编译后的体积
- babel/plugin-transform-runtime会帮助自动require @babel/runtime中的内容
- @babel/plugin-proposal-decorators将es6+中更高级的特性转化,如装饰器
- @babel/plugin-proposal-class-properties将es6中更高级的api进行转化如 类
happypack(注意它和thread-loader冲突,只能用一个,它用node的os模块调取本地线程池,将js的打包变为并行操作,文件多的时候效果体现较好,文件少没必要配置,与loader对应的id相匹配,插件内注意是loaders,内部用法和loader一样,happypack还可以对css,图片什么的打包,一个类型新建新的插件,类似HtmlWebpackPlugin用法)
基本实现
多入口
-
.VUE文件相关
插件
vue-loader
- cache-loader
-
基本实现
-
其他
clean-webpack-plugin
webpack-dev-server
区分开发环境与生产环境(调用不同插件)
缩小文件的搜索范围(配置include exclude alias noParse extensions)
使用HappyPack开启多进程Loader转换
webpack内置的DllPlugin DllReferencePlugin进行抽离第三方公共模块
配置缓存与thread-loader工作池
引入webpack-bundle-analyzer分析打包后的文件(打包可视化)
未实现功能
externals(排除CDN引用打包,未使用)
使用webpack-parallel-uglify-plugin 增强代码时间压缩(未使用)
Tree-shaking(报错)
动态配置打包入口文件
// 使用 glob 等工具使用若干通配符,运行时获得 entry 的条目module.exports = {entry: glob.sync('./project/**/index.js').reduce((acc, path) => {const entry = path.replace('/index.js', '')acc[entry] = pathreturn acc}, {}),}
则会将所有匹配 ./project/**/index.js 的文件作为入口文件进行打包,如果你想要增加一个子项目,仅仅需要在 project 创建一个子项目目录,并创建一个 index.js 作为入口文件即可。
这种方式比较适合入口文件不集中且较多的场景。

