什么是webpack
webpack是node的一个第三方模块包,用于打包代码
javascript 应用程序的 静态模块打包器 (module bundler)
为要学的vue-cli开发环境做铺垫
可以把很多文件打包整合到一起,缩小项目体积,提高加载速度
准备工作
安装webpack相关的包
yarn init -y
yarn add webpack webpack-cli -D
配置文件设置
打包的模式
模块化的写法
loaders加载器
Loader 加载器 识别非js文件
webpack 只能理解 JavaScript文件,这是 webpack 开箱可用的自带能力。loader让 webpack 能够去处理其他类型的文件,并将它们转换为有效模块,以供应用程序使用,以及被添加到依赖图中。
配置css相关加载器
模块 loader 可以链式调用。链中的每个 loader 都将对资源进行转换。链会逆序执行。第一个 loader 将其结果(被转换后的资源)传递给下一个 loader,依此类推。最后,webpack 期望链中的最后的 loader 返回 JavaScript。
应保证 loader 的先后顺序:'style-loader' 在前,而 'css-loader' 在后。如果不遵守此约定,webpack 可能会抛出错误。
webpack 根据正则表达式,来确定应该查找哪些文件,并将其提供给指定的 loader。在这个示例中,所有以 .css 结尾的文件,都将被提供给 style-loader 和 css-loader。
这使你可以在依赖于此样式的 js 文件中 import './style.css'。现在,在此模块执行过程中,含有 CSS 字符串的 标签,将被插入到 html 文件的 中。
再次在浏览器中打开 dist/index.html,你应该看到 Hello webpack 现在的样式是红色。要查看 webpack 做了什么,请检查页面(不要查看页面源代码,它不会显示结果,因为 标签是由 JavaScript 动态创建的),并查看页面的 head 标签。它应该包含 style 块元素,也就是我们在 index.js 中 import 的 css 文件中的样式。
插件plugins
插件(plugin) 除了loader做的事情 其他的事情都属于插件
loader 用于转换某些类型的模块(非js模块),而插件则可以用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量。插件主要是用来扩展 webpack 能力,插件目的在于解决loader无法实现的其他事。
想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建一个插件实例。
css抽取
webpack.docschina.org/plugins/min…
文件名每次唯一的
自动拷贝html
使用 source map
当 webpack 打包源代码时,可能会很难追踪到 error(错误) 和 warning(警告) 在源代码中的原始位置。例如,如果将三个源文件(a.js, b.js 和 c.js)打包到一个 bundle(bundle.js)中,而其中一个源文件包含一个错误,那么堆栈跟踪就会直接指向到 bundle.js。你可能需要准确地知道错误来自于哪个源文件,所以这种提示这通常不会提供太多帮助。
为了更容易地追踪 error 和 warning,JavaScript 提供了 source maps 功能,可以将编译后的代码映射回原始源代码。如果一个错误来自于 b.js,source map 就会明确的告诉你。
webpack-dev-server
webpack.docschina.org/guides/deve…
以上配置告知 webpack-dev-server,将 dist 目录下的文件 serve 到 localhost:8080 下。(译注:serve,将资源作为 server 的可访问文件)
模块热替换 ( 热替代 )
模块热替换(hot module replacement 或 HMR)是 webpack 提供的最有用的功能之一。它允许在运行时更新所有类型的模块,而无需完全刷新。本页面重点介绍其实现,而 概念 页面提供了更多关于它的工作原理以及为什么它有用的细节。
启用HMR
此功能可以很大程度提高生产效率。我们要做的就是更新 webpack-dev-server 配置, 然后使用 webpack 内置的 HMR 插件。我们还要删除掉 print.js 的入口起点, 因为现在已经在 index.js 模块中引用了它。
从 webpack-dev-server v4.0.0 开始,热模块替换是默认开启的。
模块懒加载 ( 代码分离 )
代码分离是 webpack 中最引人注目的特性之一。此特性能够把代码分离到不同的 bundle 中,然后可以按需加载或并行加载这些文件。代码分离可以用于获取更小的 bundle,以及控制资源加载优先级,如果使用合理,会极大影响加载时间。
常用的代码分离方法有动态导入:通过模块的内联函数调用来分离代码。
Tree shaking
tree shaking 是一个术语,通常用于描述移除 JavaScript 上下文中的未引用代码(dead-code)。它依赖于 ES2015 模块语法的 静态结构 特性,例如 import 和 export。这个术语和概念实际上是由 ES2015 模块打包工具 rollup 普及起来的。
Babel
把es6转换成es5
在开发中我们经常使用ES6+,typescript等语法,但是在打包后,这些代码浏览器不能识别,所以此时我们使用babel来解决该问题。
babel定义:babel是一个工具链主要用于将ES6+语法兼容老版本的浏览器。
从上面的例子来看,我们在运行babel代码时,不能将箭头函数转换为普通含函数。原因是需要安装一些插件。
1、@babel/plugin-transform-arrow-functions
2、@babel/plugin-transform-block-scoping
npm install babel-loader @babel/core @babel/plugin-transform-arrow-functions @babel/plugin-transform-block-scoping -D
这样做比较麻烦,所以,我们还可以这样做
如何提高webpack的构建速度
1. 关闭sourcemap
(1) 因为关闭了,打包的时候就少生成一些map文件,性能肯定速度变快
2. 缩小loader查找范围
缩小编译的范围
3. 优化 resolve.alias
4. 使用happyPack
Happypack 将 loader 由单进程转为多进程 webpack 的缺点是单线程的,我们可以使用 Happypack 把任务分解给多个子进程去并发执行,大大提升打包效率;配置的方法是把 loader 的配置转移到 HappyPack 中去;
5. 移除console.log: 通过babel的插件进行移除(babel-plugin-transform-remove-console)
6. 提取公用库
DllPlugin 提取公用库 开发过程中,我们经常需要引入大量第三方库,这些库并不需要随时修改或调试,我们可以使用DllPlugin和DllReferencePlugin单独构建它们,配置webpack.dll.config.js www.cnblogs.com/sexintercou…
element ui ,vue ,echarts 每次打包都要把这些打包没有任何必须,因为这些东西是第三方,永远不会变,其实每次打包变是我们自己在src中写的代码 dllPlugins可以实现把这些第三方直接单独打包好之后缓存起来,以后打包只需要打包自己的东西就可以了
7. 对图片进行压缩 image-webpack-loader