webpack整理

160 阅读2分钟

优化点

开发优化

0.node环境安装最新稳定版本

1.devServer: 配置contentBase 节省前端静态资源没必要的操作?

2.devtool->sourceMap选择eval-cheap-module-source-map 最优(有个                               sourceMaploader)

3.resolve 优化,减少查找文件的消耗:

  • extensions:配置扩展名
  • modules:查询第三方依赖库的文件位置
  • alias:起别名,减少查找过程
  • externals:对通过cdn链接引用的对象不对其进行打包

4.配置loader的exclude或者include减少操作文件范围(loader消耗的性能很大)

5.cache-loader:缓存一些性能开销比较大的 loader 的处理结果

6.url-loader: 对小图标转base64打包到js里面

7.babel/preset-env设置useBuiltIns:usage 按需加载替换API的方法

8.css文件单独打包使用 minicssextractplugin并用contenthash命名并用                                   optimizecssassetswebpackplugin压缩

9.使⽤happypack并发执⾏任务

运行优化

1.配置optimization.splitChunks all => 所有的chunks代码公共的部分分离出来成为⼀个单独的⽂件
2.配置optimization.usedExports true => tree shaking只在mode pro时生效

3.配置optimization.concatenateModules true =>通过 ES6 语法的静态分析,分析出模块之间的依赖关 系,尽可能地把模块放到同⼀个函数中

4.webpack魔法注释,预加载和懒加载

5. HardSourceWebpackPlugin对不怎么变动版本的第三方库做缓存加快打包速度!、

6.babel-plugin-import 按需加载第三方库

问题

1.为什么Loader 的执行顺序是固定从后往前?

因为webpack选择了compose这样的函数式编程方式,而 gulp 却选择应用从左到右的pipe 管道式编程。

function compose(...funcs){
    return funcs.reduce((a,b)=>(...args)=>a(b(args)))
}

2.plugins有哪些?(作为webpack功能补充增强,作用于整个打包过程)

  • cleanwebpackplugin清空打包目前旧资源
  • htmlwebpackpluginhtml模板
  • minicssextractplugin 单独打包css文件
  • optimizecssassetswebpackplugin压缩css文件
  • babel-plugin-import 按需加载第三方库

3.loader有哪些?函数(webpack默认只支持js和json格式文件)

  • less-loader postcss-loader css-loader(把css模块内容放到js中;开启cssmodules) style-loader(从js中提取css内容,默认创建style标签将css插入标签并挂在到文档的head上)

  • filer-loader -> url-loader  img-loader

  • babel-loader

5.多入口怎么配置?

entry用对象模式,output用占位符命名

6.mode原理?

配置development和production启动的构建plugin不同。

7.dev配置和pro配置怎么区分?

webpack-merge合并baseconfig和devconfig或proconfig 

执行时webpack -- config ./configurl或者用cross-env变量区别

webpack原理

1.fs读取文件

2.Babel/parser解析成AST,将代码转化为(抽象语法)对象

3.Babel/traverse遍历AST树,对import依赖节点做回调解析出对应路径并记录

4.Babel/core的transformFromAst和Babel/presets将AST树从es6转es5,用babel/polyfile替换es6api

5.Babel/generator对require和exports函数替换

一个module对应一个文件,一个chunk由多个module构成,bundle是资源文件

chunkhash:chunk内容改变hash才会改变

contenthash:一般用于css文件单独打包使用 minicssextractplugin