source-map
{
devtool: 'cheap-module-source-map'
}
模式:
source-map 是webpack的内置模块,他有七种不同的模式,如下:
- eval:每个module会封装到eval包裹起来执行,并且会在末尾追加注释 //@sourceURL
- source-map:生成一个SourceMap文件
- hidden-source-map:和 source-map 一样,但不会在 bundle 末尾追加注释
- inline-source-map:生成一个 DataUrl 形式的 DourceMap 文件
- eval-source-map:每个module会通过eval()来执行,并且生成一个 DataUrl形式的SourceMap
- cheap-source-map:生成一个没有列信息的SourceMap文件,不包含loader的sourcemap
- cheap-module-source-map:生成一个没有列信息的SourceMap文件,同时loader的sourcemap也简化为只包含对应行的
注意:
- 如果默认不设置
devtool: xxx
默认对应 eval - 推荐使用
cheap-module-source-map
,该模式会精确 debug 源代码所对应行 - 生产环境一般不会开启sourcemap功能,有两个原因:
- 通过bundle和sourcemap文件,可以反编译出源码,有泄露源码的风险
- suorcemp文件的体积相对比较巨大,这跟我们生产环境追求的更小更轻量的bundle相悖
devServer
在开发环境下我们往往需要启动一个web服务,方便我们模拟用户从浏览器访问我们的web服务,读取我们的打包产物,以观看我们的代码在客户端的表现,webpack内置了这个功能,我们只需要简单的配置就可以开启它。安装:
npm install -D webpack-dev-server
配置:
devServer: {
static: path.resolve(__dirname, './dist'),
compress: true, // 配置文件在服务端是否压缩传输
port: 3000, // 配置端口号
headers: [ // 添加响应头
{
key: 'X-Custom',
value: 'foo',
},
{
key: 'Y-Custom',
value: 'bar',
},
],
proxy: { // 代理服务器,会将请求代理到 http://localhost:8080
'/api': 'http://localhost:8080',
},
historyApiFallback: true, // 在路由找不到路由时自动显示根页面内容
}
模块热替换与热加载
模块热替换可以让我们在程序在运行过程中,无论是替换,删除,添加 模块,无需从新加载整个页面。
热加载就是说我们在修改模块时,会自动给我们刷新浏览器配置:
devServer: {
hot: 'true',
},
注意:
从 webpack-dev-server v4 开始热替换是默认开启。eslint
安装:
npm install eslint -D
初始化:
这里我们根据提示选择对应所需要的选项就好
初始化以后我们根目录下就出现了一个eslint --init
.eslintrc.js
文件,详细配置可以去 eslint官网 查看。
我们希望能在编译器直观的看到错误,可以在vscode安装一个 eslint插件:module.exports = {
env: {
browser: true,
es2021: true,
},
extends: [
'airbnb-base',
],
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
},
rules: {
},
};
拓展:
我们可以通过配置vscode来实现自动eslint代码补全及错误纠正,我们只需要在 vscode 的设置(setting.json)中贴入以下代码,就可以实现 c+s 的时候自动纠错:{
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"editor.formatOnSave": true,
//autoFix默认开启,只需输入字符串数组即可
"eslint.validate": [],
"eslint.codeAction.showDocumentation": {
"enable": true
},
"eslint.alwaysShowStatus": true,
"eslint.format.enable": true,
"explorer.confirmDelete": false,
"typescript.updateImportsOnFileMove.enabled": "always",
"javascript.updateImportsOnFileMove.enabled": "always",
"git.ignoreMissingGitWarning": true,
"files.eol": "\n",
}