# Webpack 打包
- 新特性代码编译
- 模块化 JavaScript 打包
- 支持不同类型的资源模块
# 前端打包工具
- Webpack (前端整体的模块化)
- 模块打包器(Modele bundler) 零散的打包到一起
- 模块加载器(Loader) 转换有兼容问题的代码
- 代码拆分(Code Splitting) 按照我们的需要去拆分打包
- 资源模块(Asset Module)
# Webpack 快速上手
webpack 4.0 版本以后支持零配置快速打包
'src/index.js' -> 'dist/main.js'
webpack工作模式 官方文档 (opens new window) 也可在配置文件中设置
- webpack --mode production 打包成压缩后的代码
- webpack --mode development 打包成带注释的兼容性强方便调试
- webpack --mode none Opts out of any default optimization options
Webpack 导入资源模块文件资源加载器 设置 publicPath 打包文件所处的路径
Webpack URL 加载器,base64转换成二进制文件,不用再去http请求,
- 使用代码的形式表示任何形式的文件 url-loader
- 小文件使用Data Urls,减少请求次数
- 大文件单独提取存放,提高加载速度
Webpack 常用加载器分类
- 编译转换类 css-loader 将css文件代码转换为bundle中的一个模块,然后通过javascript运行css代码
- 文件操作类 file-loader url-loader 将文件拷贝到输出的目录,同事将文件的访问路径向外导出
- 代码检查类 lint
babel-loader es5 转换为 es6
- webpack 只是打包工具 要用加载器来编译代码
- babel-loader @babel-core @babel/preset-env 模块\
webpack加载资源的方式
- 遵循ES Module是标准的import声明
- 遵循Common JS 标准的 require函数
- 遵循AMD标准的define函数和require函数
- 样式代码终中的@import 指令和url函数
- HTML 代码中图片标签的src属性
# webpack插件机制 Plugin解决其他自动化工作 loader负责资源模块加载
- 清除dist目录
- 拷贝静态文件到输出目录
- 压缩输出代码
# 常用插件
- clean-webpack-plugin
- html-webpack-plugin 自动生成使用bundle.js的html
- copy-webpack-plugin 输出打包静态文件
# webpack 理想开发体验
- 1、以HTTP服务运行 Webpack Dec Server browser-sync dist --files '**/*'
直接运行Webpack Dec Server命令,将自动打包编辑,并开启http服务去运行文件
- 2、自动编译+自动刷新
webpack dev server --open 代理api 主机名是HTTP协议中的相关概念
- 3、以Source Map支持
webpack 配置 Source Map devtool: 'source-map' eval模式下的Source Map eval('console.log(123) //# sourceURL=./foo/bar.js')
# Webpack 自动刷新的问题
> 在页面不刷新的情况下,更新代码
- Webpack HMR 模块热替换
devServer: { hot: true // 打开hot配置 }, plugins: [ // 添加hot插件 new webpack.HotModuleReplacementPlugin() ] - css热替换开箱即用,js需使用HMR API
// 在页面的打包入口文件 index.js 使用api hmr api 给moudele提供了一个hot api,accept对象 // accept 依赖模块的路径,依赖模块处理的函数 module.hot.accept('./heading.js', () => { console.log('heading模块更新了') }) - 图片模块热替换
module.hot.accept('./qianqian.png', () => { img.src = background console.log('background') })
# wabpack不同环境下的配置
配置文件根据管径不同导出不同的配置
一个环境对应一个配置文件
# Tree Shaking 生产模式自动开启
optimization: {
useExports: true, // 只导出使用到的代码 标记枯树枝
minimize: true, // 未引用的代码都被移除到了 摇掉枯树枝
concatenateModules: true // 尽可能将所有模块合并输出到同一个模块中
}
# 代码分割 Code Splitting
- 多入口打包
// 多入口,不是数组,数组说明多个文件打包成一个文件里
entry: {
index: './src/index.js',
ablum: 'src/ablum.js',
},
output: {
filename: '[name].bundle.js'
}
// 避免一个文件引入多的js文件
new HtmlWebpackPlugin({
title: 'webpack Plugin Sample',
meta: {
viewport: 'width=decice-width'
},
template: './src/index.html',
chunks: ['index'] // 每个打包独立生成自己独立的chunks文件
}),
# 按需加载 需要用到某个模块时,在加载这个模块 (动态导入) 动态导入的模块会被自动分包
// esmodules 模块对象 webpackChunkName魔法注释
import(/* webpackChunkName: 'posts' */'./posts/posts/') .then(({defatule: posts}) => {
// do something
})
# externals 加载外部包
# 常用网站
www.babeljs.cn
browserList