在最近的项目迁移中,我从 GitHub 上找到一个优秀的 Vue2 后台管理模板,将原有项目的 100 多个业务文件整合到新模板中。迁移完成后,大部分功能运行正常,但地图功能中的 Marker 图标大小却出现了明显异常。
通过浏览器开发者工具检查,发现了一个关键样式规则:
.amap-icon img,
.amap-marker-content img {
width: 25px;
height: 34px;
}
但在 VSCode 中进行全局搜索时,却找不到任何包含这些选择器的 CSS 文件。最终发现这些样式被编译到了app.a9a7ba88.css
文件中——这是 Webpack 构建过程中生成的 CSS 文件。
迁移前功能样式
迁移后的样式
在 Vue CLI 项目中(基于 Webpack),开发环境也会对 CSS 资源进行处理:
这使得我们在浏览器中看到的:
app.a9a7ba88.css
)在全局样式文件中添加强制覆盖:
::v-deep .amap-icon img {
width: 30px !important;
height: 30px !important;
}
因为地图功能中的 Marker 多处使用,所以需要设置全局 css。
SourceMap是一个 JSON 格式的信息文件,它建立了编译后代码与原始源代码之间的映射关系。通过这种映射,开发者工具可以:
1.修改vue.config.js
:
// vue.config.js
module.exports = {
css: {
sourceMap: true, // 开启 css source map,
},
productionSourceMap: true, // 开启 JS sourceMap
};
2. 重启开发服务器:
npm run serve
dist
目录在 dist
文件夹中,你将会看到以下几类文件:
.css
和 .js
文件是编译后的文件。.gz
文件是压缩后的文件。.map
文件是编译后代码与原始源代码之间的映射文件。Source Map 文件
{
// SourceMap规范版本(当前为3)
"version": 3,
// 原始文件路径数组
"sources": [
"webpack:///node_modules/@smallwei/avue/lib/index.css",
"webpack:///node_modules/nprogress/nprogress.css",
"chunk-vendors.33662982.css",
"webpack:///node_modules/element-ui/lib/theme-chalk/index.css"
],
// 这个数组包含了源代码中的标识符(如变量名)
"names": [],
// 使用Base64 VLQ编码的位置映射信息
"mappings": "AAAk2gC,gBAAqJ,CCkBv/gC,gBAUM,2CCEN,CC9BiB,oIAAoI,iBAAiB,CAAC,gEAAgE,mBAAmB,CAAC,mdAAmd,eAAe,CAAC,WAAW,yBAAA,CAA0B,wHAAiH,CAAA,eAAoB,CAAA,mBAAkB,CAAA,iBAAA,CAAA,uCAAuC,mCAA+C,CAAA,UAAkB,CAAA,iBAAgB,CAAA,eAAoB,CAAA,mBAAoB,CAAA,mBAAc,CAAA,aAAA,CAAA,uBAA6C,CAAA,oBAAA,CAAA,kCAAmC,CAAA,iCAAkC,CAAA,GAAG,2BAAA,CAA4B,mBAAmB,CAAC,GAAK,+BAAA,CAAiC,uBAAwB,CAAC",
"file": "chunk-vendors.33662982.css",
// 原始文件内容
"sourcesContent": []
}
在 "webpack:///node_modules/@smallwei/avue/lib/index.css"目录下找到对应 css,
.amap-icon img,
.amap-marker-content img {
width: 25px;
height: 34px;
}
// package.json
"dependencies":{
"@smallwei/avue": "2.6.18",
}
@smallwei/avue
安装导致。在编译后的文件末尾添加特殊注释:
// JavaScript 文件
//# sourceMappingURL=app.min.js.map
/* CSS 文件 */
/*# sourceMappingURL=styles.css.map */
浏览器执行以下步骤:
sequenceDiagram
participant Browser
participant DevTools
participant Server
Browser->>Server: 请求 app.min.js
Server-->>Browser: 返回 JS 文件 + sourceMappingURL
DevTools->>Server: 请求 app.min.js.map (异步)
Server-->>DevTools: 返回 SourceMap 文件
DevTools->>DevTools: 解析映射关系
Note right of DevTools: 建立位置映射表
DevTools-->>Browser: 显示原始源代码位置
SourceMap 是现代前端开发的调试利器,但在生产环境中却成为一把双刃剑。一方面它提供了无与伦比的调试能力,另一方面却带来安全风险和性能问题
graph LR
A[SourceMap优势] --> B[快速定位生产环境问题]
A --> C[完整错误堆栈追踪]
A --> D[还原混淆代码]
E[SourceMap风险] --> F[暴露源代码]
E --> G[增加文件体积]
E --> H[潜在安全漏洞]
适用场景:
配置示例(Vue CLI):
// vue.config.js
module.exports = {
productionSourceMap: false, // 禁用 SourceMap 生成
};
编译后源码和 SourceMap 分开部署到不同的服务上。
graph TD
A[构建系统] --> B[生成 app.js]
A --> C[生成 app.js.map]
B --> D[部署到生产 CDN]
C --> E[上传到安全存储]
F[错误监控系统] --> E
G[开发者] --> E
实现步骤:
// vue.config.js
module.exports = {
productionSourceMap: true,
configureWebpack: {
devtool: "hidden-source-map", // 不包含 sourceMappingURL
},
};
只有白名单 Ip 地址才能访问
location ~ \.map$ {
# IP白名单
allow 192.168.1.0/24;
deny all;
# 基础认证
auth_basic "SourceMap Access";
auth_basic_user_file /etc/nginx/.htpasswd;
# JWT验证
auth_request /auth;
}
location = /auth {
internal;
proxy_pass http://auth-service/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
在浏览器中打开构建之后代码文件,然后右键,就可以看到 add source map 的选项
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。