从代码角度看:
传统做法(vue2.5之前没有vue.config.js时)是:将webpack.base.config.js中各个配置对象拷贝一份(基础配置)。然后根据不同的环境merge不同的配置。 比如测试环境独有的代理devServer、sourcemap、热更新HotModuleReplacementPlugin。 比如正式环境独有的UglifyJsPlugin、extract-text-webpack-plugin、optimize-css-assets-webpack-plugin、html-webpack-plugin等等。
base.config.js
webpack.base.config.js文件其实就足足的表达了这个webpack的构成到底是有哪些部分组成。 由于配置较多,我们这里支只对其中重要的几个配置做简要概述。
我们必须知道的是webpack她只认识js,loader就是用来将不是js的文件经过函数处理成js。 然后这个loader的配置,如上所示我们通常写在modules.rules属性中。 最后,需要注意的是loader支持链式调用(每个loader可以处理之前已经处理过的资源),到这对于loader的掌握已经算快及格了。 接着看完loader和plugin之后,我们就及格了。
常用loader 样式loader
编译loader
文件loader
webpack的plugin要比loader强大,这个plugin在webpack的整个生命周期活动,可以做一些在构建范围内的事情。 通过之前的学习,我们也知道需要哪些插件,我们就直接引入,然后以new对象的形式传入plugins配置对象中去就可以。 然后,如果再深入一点点的话,我们看plugin的本质:其实就是具有一个apply方法的JS对象。这个apply方法是会被webpack的compiler调用的。并且在整个编译生命周期都可以访问compiler对象。
内置插件
其它插件
区别
自定义loader
自定义Plugin
// 导出一个函数,其中source为webpack传递给loader的输入参数--文件源内容
module.exports = function(source){
const content = doSomething2JsString(source);
// 如果loader配置了options对象,那么this.query将指向options
const options = this.query
this.fallback(null,content) //异步
return content; //同步
}
自定义Plugin,需要遵循的规范是:
class MyPlugin{
//Webpack会调用MyPlugin实例的apply方法给插件实例传入compiler对象
apply(compiler){
// 找到合适的事件钩子,实现自己的插件
compiler.hooks.emit.tap('MyPlugin',compilation=>{
//do something
})
}
}
webpack的热更新又称为热替换(Hot Module Replacement) – HMR 这个机制可以做到不用刷新浏览器而将变更的模块替换掉。 HMR的核心就是:客户端从服务端拉去更新后的文件(他们直接维护了一个websocket),当本地资源发生变更后,客户端进行资源对比,然后增量更新。 开启HMR,要在webpack配置文件的devServer中设置hot为true即可。
配置
webpack中提供服务器的工具为webpack-dev-server,只适用与开发阶段 配置核心为:devServer -> proxy
原理
Proxy工作原理实际上利用http-proxy-middleware这个http中间件,实现请求转发给其他服务器。
const express = require('express')
const proxy = require('http-proxy-middleware')
const app = new express()
app.use('/api',proxy({target:'http://liugezhou.online'},changeOrigin:true))
// http://localhost:3000/api/foo/bar ->http://liugezhou.online/aoi/foo/bar
跨域
过程:
优化loader配置
使用loader时,可以通过配置include、exclude、test等属性来匹配文件
合理使用resolve.extensions 优化resolve.modules
项目构建时,可以通过指明存放第三模块的绝对路径来减少寻找的时间
优化resolve.alias
别名使用
rollup
相比webpack,rollup要小巧很多,当下的vue、react、three.js都是使用rollup打包
vite
parcel