1. 前言
日常开发某个功能后,成功部署上线😃,测试人员测试发现严重bug😥,立马打开项目仓库,查看代码思路,发现可疑之处,改正非常迅速😏,刷新屏幕后,发现还有错误哦😱。于是继续排查代码,清缓存,最后才发现是线上地址😭。详细操作看:
本文主要讲述以下几点内容:
- 分析 favicon 的痛点问题
- 通过动态添加 link 标签添加 favicon
- 通过 webpack 构建添加 favicon
2. 分析问题
既然知道这个痛点了,由于 ip 地址很难注意到,就搞一个明显的 favicon 来处理吧,线上保持不变,本地代码添加一个逻辑,弄个 favion
图片,鲜明的颜色对比。
3. 解决思路
3.1 直接动态添加 link 标签中,这种是直接在 dom 生成后引入脚本处理。
if (process.env.NODE_ENV === "development") {
changeFavicon("../public/favicon_dev.ico");
}
function changeFavicon(src) {
const link = document.createElement("link");
const oldLink = document.getElementById("dynamic-favicon");
link.id = "dynamic-favicon";
link.ref = "shortcut icon";
link.href = src;
if (oldLink) {
document.head.removeChild(oldLink);
}
document.head.appendChild(link);
}
动态设置: 这种动态创建 link 标签,然后添加元素,可以从服务器动态获取图片,随意更换 favicon。
3.2 通过 webpack 构建
VueCli3 以前,webpack 的配置是暴露出来的,我们可以直接修改 webpack 的配置:
// webpack.dev.config.js
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true,
favicon: path.resolve('favicon.icon')
})
VueCli3 以后,调整 webpack 配置是通过 vue.config.js 文件配置的,有两种配置方式:
简单配置方式:
// vue.config.js
module.export = {
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
// 为生产环境作配置
} else {
// 为开发环境做配置
}
}
}
链式操作: Vue CLI 内部的 webpack 配置是通过 webpack-chain 维护的。这个库提供了一个 webpack 原始配置的上层抽象,使其可以定义剧名的 loader 规则和具名插件,并有机会在后期进入这些规则并对它们做改造。
// vue.config.js
module.exports = {
chainWebpack: config => {
config.plugin('html').tap(
args => {
if (process.env.NODE_ENV === 'development') {
args[0].favicon = path.resolve('public/favicon_dev.ico');
}
return args; /* 传递给 html-webpack-plugin's 构造函数的新参数 */
})
}
}
注意的是:本次配置 favicon 用链式操作,这样就不会覆盖原来的 html-webpack-plugin
的配置选项。使用 configureWebpack
简单配置方式的话,需要重新制定其他的 html-webpack-plugin
的选项。
4. 总结
除了开发环境与线上环境的区分外,如果还有测试环境的话,我们也可以照猫画虎撸上去。除此之外,额外收获是, 由于项目的基线环境已由大佬搭好,一直没怎么碰系统底层的配置,通过设置下这个 favicon 的过程中,也算是了解了 vueCli 应用中关于 webpack 的一些处理。
(本文完)
参考资料
- webpack 相关的配置 Vue CLI 官网
- 有关于 html-webpack-plugin 在 webpack-chain 中的配置看这里webpack-chain
- 本文思路,主要是看到张大大的文章 www.zhangxinxu.com/wordpress/2…