webpack之source-map、devServer
1、source-map
作为一个开发人员,都要求我们开发环境中都有一个不可或缺的功能,就是 debugger;
模式 | 解释 |
eval | 每个module会封装到eval里包裹起来执行,并且在末尾追加注释//@sourceURL |
source-map | 生成一个SourceMap文件 |
hidden-source-map | 和source-map一样,但不会在bundle末尾追加注释 |
inline-source-map | 生成一个DataUrl形式的SourceMap文件 |
eval-source-map | 每个Module会通过eavl()来执行,并且生成一个DataUrl形式的SourceMap |
cheap-source-map | 生成一个没有列信息的SourceMap文件,不包含loader的sourcemap(譬如babel的sourcemap) |
cheap-module-source-map | 生成一个没有列信息的SourceMaps文件,同时loader的sourcemap也被简化为只包含对应行为的。 |
要注意的是,生产环境我们一般不会用其sourcemap功能,主要有两点原因:
通过bundle和sourcemap文件,可以反编译出源码,也就是说:线上产物有sourcemap文件的话,就意味着有暴露源码的风险;
我们可以观察到,sourcemap文件的体积相对比较巨大,这跟我们生产环境的追求不同(生产环境追求更小更轻量的bundle)
在实际的开发中推荐使用:cheap-module-source-map;在开发环境中不会配置 devtool
2、devServer
(1)在代码中的配置
const path = require('path');//进入Node.js内置的模块path
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
mode:'development',
entry:'./app.js',
devServer: {
static: path.resolve(_dirname, './dist'),
compress: true//这个选项可以设置我们是不是在服务器端进行代码压缩,使它在传输的过程中可以减少传输的文件数据的大小
port:3000//主要用来配置服务的端口号
headers: {
'X-Access-Token':’abs23‘//可以把一个token信息传给浏览器
},
proxy: {
'/api': 'http://loaclhost:9000',
},
https: true,
historyApiFallback: true,
host:'0.0.0.0'
},
plugins:[
new HtmlWebpackPlugin()
]
}
(2)模拟添加响应头
有些场景需求下,我们需要为所有响应添加headers,来对资源的请求和响应打入标志,以便做一些安全防范,或者方便发生异常后做请求的链接跟踪
(3)开启代理
(4)https
如果想让在本地http服务变成https服务,我们只需要这样配置:
devServer: {
https: true
}
注意:此时访问http://localhost:port是无法访问我们的服务的,我们需要在地址栏里加前缀:https;注意:由于默认配置使用的是自签名证书,所以有得浏览器会告诉你是不安全的,但我们依然可以继续访问它,当然我们可以提供自己的证书(如果有的话)
devServer: {
https: {
cacert:'./server.pem',
pfx:'./server.pfx',
cert:'./server.crt',
passphrse:'webpack-dev-server',
requestCert: true,
}
}
(5)http2
如果想要配置http2,那么直接设置:
devServer: {
http2: true
}
http2默认自带自签名证书,当然仍然可以通过https配置项来使用自己的证书
(6)historyApiFallback
如果我们的应用是一个SPA(单页面应用),当路由到/some时(可以直接在地址栏里输入),会发现此时刷新页面后,控制台会报错
devServer: {
historyApiFallback: true
}
(7)开发服务器主机
如果你在开发环境中起了一个devserve服务,并期望你的同事能访问到它,你只需要配置:
module.exports = {
devServer: {
host:'0.0.0.0'
}
}
这个时候,如果你的同事跟你处于同一局域网下,就可以通过局域网api来访问你的服务器啦