点错了 直接发布了 千万别说没写完 后续会更新的javascript
webpack 基本 文档梳理
概念
webpack :一个现代 JavaScript 应用程序的静态模块打包器(module bundler)css
入口(entry): webpack 应该使用哪一个模块,来做为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的
输出(output): 属性告诉 webpack 在哪里输出它所建立的 bundles,以及如何命名这些文件
loader: 用于对模块的源代码进行转换,让 webpack 可以去处理那些非 JavaScript 文件
插件(plugins): 用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到从新定义环境中的变量
模式(mode): 开发环境仍是生产环境
模块解析(resolver): 帮助找到弄快的绝对路径。
构建目标(targets): node环境仍是浏览器环境
模块热替换(HMR): 在应用程序运行过程当中替换、添加或删除模块,而无需从新加载整个页面
多种配置类型
导出一个函数 : 运用在开发和生产构建区别之间,用webpack-merge 合并
导出一个 Promise : 须要异步地加载所需的配置变量,例如:动态加载文件路径等
导出 多个配置对象: 例如node环境 和 web环境 分开配置
webpack的基本功能和工做原理
代码转换:TypeScript 编译成 JavaScript、SCSS 编译成 CSS 等等
文件优化:压缩 JavaScript、CSS、HTML 代码,压缩合并图片等
代码分割:提取多个页面的公共代码、提取首屏不须要执行部分的代码让其异步加载
模块合并:在采用模块化的项目有不少模块和文件,须要构建功能把模块分类合并成一个文件
自动刷新:监听本地源代码的变化,自动构建,刷新浏览器
代码校验:在代码被提交到仓库前须要检测代码是否符合规范,以及单元测试是否经过
自动发布:更新完代码后,自动构建出线上发布代码并传输给发布系统。
webpack构建过程
从entry里配置的module开始递归解析entry依赖的全部module
每找到一个module,就会根据配置的loader去找对应的转换规则
对module进行转换后,再解析出当前module依赖的module
这些模块会以entry为单位分组,一个entry和其全部依赖的module被分到一个组Chunk
最后webpack会把全部Chunk转换成文件输出
在整个流程中webpack会在恰当的时机执行plugin里定义的逻辑
webpack
经常使用loader
经常使用 plugins (npm 官网能够本身找链接 这里之后再把链接加上)
babel
其余经常使用 node package
点击进入查看 综合应用 html
react 经常使用 项目依赖 package
react 经常使用 开发依赖 package
webpack bundle 优化
Tree-shaking
用于描述移除 JavaScript 上下文中的未引用代码(dead-code)
Tree-shaking 在production环境使用,要开启package.json中 {sideEffects:true}
Tree-shaking 只能消除没有被引用的变量和函数,不能消除类
ES6模块依赖关系是肯定的,和运行时的状态无关,能够进行可靠的静态分析。 Tree-shaking以此做为基础区分
实践
babel-plugin-import —— 按需引入 点击进入antd官网说明
{
plugins : [
["import" ,
{ "libraryName" : "antd" , 'libraryDirectory' : 'es' , "style" : true }
]
]
}
复制代码
babel-plugin-ramda —— ramda Tree Shake
{
plugins : [
["ramda" , {
"useES" : true
}]
,
}
复制代码
webpack bundle文件去重 todo 等一下 本身研究一下 下面两个配置的区别
{
plugins : [
new webpack.optimize.CommonsChunkPlugin({
name : "commons" ,
}),
new webpack.optimize.CommonsChunkPlugin({
children : true ,
async : true ,
minChunks : 2 ,
}),
]
}
复制代码
Code split
入口起点:使用 entry 配置手动地分离代码。
防止重复:使用 CommonsChunkPlugin 去重和分离 chunk
动态导入:经过模块的内联函数调用来分离代码
lazy-load
开发速度和打包优化
hmr 与 hot-loader
happypack
hardsource
bundle-analyzer
css minimize
transform-react-remove-prop-types
{
"presets" : [["es2015" , { "modules" : false }], "stage-2" , "react" ],
"env" : {
"production" : {
"plugins" : ["transform-react-remove-prop-types" ]
}
}
}
复制代码
其余
PWA
自定义 plugin
自定义 loader
参考文献
Webpack4+Babel7优化70%速度
webpack面试题
用 nodejs 写一个命令行工具 :建立 react 组件的命令行工具
Tree-Shaking性能优化实践 - 原理篇
Tree-Shaking性能优化实践 - 实践篇