【前端】Vue2全家桶案例《看漫画》之七、webpack插件开发——自动替换服务器API-URL
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_7.html
项目github地址:https://github.com/shamoyuu/vue-vux-iconan
想来这个项目也做了一月了,期间部署了好几次,也经常在本地联调后台接口,所以服务器地址经常换来换去。
有一次部署的时候还把localhost给部署上去了,不得不部署第二次。
我们这一章就来解决这个问题,根据命令行参数,打包自动替换不同的服务器地址,不用再修改api.js了。
首先我们修改tools/api.js,为我们的服务器地址设置一个占位符
let apiUrl = "<<<service>>>";
let picServer = "<<<pic-service>>>"; console.info("apiUrl", apiUrl);
console.info("picServer", picServer);
因为对js的压缩不会压缩字符串,所以我们就可以通过替换占位符来做到我们上面提到的功能。
然后我们新建一个server.json文件,来保存我们各个平台,各个环境下的服务器地址
{
"webapp": {
"environments": {
"dev": {
"service": "http://localhost:18080/iconan",
"pic-service": "http://iconan.bj.bcebos.com"
},
"test": {
"service": "http://meleong.duapp.com/iconan",
"pic-service": "http://iconan.bj.bcebos.com"
},
"production": {
"service": "/iconan",
"pic-service": "http://iconan.bj.bcebos.com"
}
}
},
"mobile": {
"environments": {
"dev": {
"service": "http://localhost:18080/iconan",
"pic-service": "http://iconan.bj.bcebos.com"
},
"test": {
"service": "http://meleong.duapp.com/iconan",
"pic-service": "http://iconan.bj.bcebos.com"
},
"production": {
"service": "http://meleong.duapp.com/iconan",
"pic-service": "http://iconan.bj.bcebos.com"
}
}
}
}
这样就可以一目了然,想修改也特别方便。
然后我们修改gulpfile.js,先来通过指令的参数获取到我们想要的服务器地址
const serverConfig = require(process.cwd() + "/server.json");
global.SERVERS = serverConfig[args.t]["environments"][args.e];
然后我们来替换,如果是用gulp的管道的话,可以这么写,修改webpack.build文件
"webpack.build": (done) => {
let spinner = ora("正在打包,请稍后...");
spinner.start();
webpack(webpackConfig, (err, stats) => {
spinner.stop();
if (err) throw err;
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + "\n\n"); if (stats.hasErrors()) {
console.log(chalk.red(" 构建出错。\n"));
process.exit();
} // let stream = gulp.src(["dist/**/*"]);
// let servers = serverConfig[args.t]["environments"][args.e];
// for (let key in servers) {
// stream = stream.pipe(replace("<<<" + key + ">>>", servers[key]))
// }
// stream.pipe(gulp.dest("dist"))
// .on('end', function () {
// console.log(chalk.cyan(" 构建完成。\n"));
// done();
// }); done();
});
},
就是图里注释掉的那段。但是这样在开发环境下不可用,因为我们是用webpack配置的开发环境,如果你用的是gulp,可以这么做。
所以我们给webpack写一个插件来实现这个功能。
首先我们修改dev任务
const webpackDevConfig = require(process.cwd() + "/build/webpack.dev.conf"); "dev": () => {
let devCompiler = webpack(webpackDevConfig); new WebpackDevServer(devCompiler)
.listen(webpackDevConfig.devServer.port, webpackDevConfig.devServer.host, function (err) {
if (err) throw new gutil.PluginError("webpack-dev-server", err);
console.log(chalk.cyan(" 服务已启动\n"));
});
}
然后修改webpack.dev.conf最后的exports = devWebpackConfig,不要返回那个Promise。
然后我们写一个插件,新建build/plugin/servers-replace-webpack-plugin.js文件
function ServersReplaceWebpackPlugin(options) {
this.options = options;
} ServersReplaceWebpackPlugin.prototype.apply = function (compiler) {
let that = this; compiler.plugin('emit', function (compilation, callback) {
// 检查所有编译好的资源文件,替换所有需要替换的地方
for (var filename in compilation.assets) {
if (filename.endsWith(".js")) {
console.info("filename =", filename);
let newFile = compilation.assets[filename].source().toString(); let servers = that.options;
for (let key in servers) {
newFile = newFile.replace("<<<" + key + ">>>", servers[key]);
} compilation.assets[filename] = {
source: function () {
return newFile;
},
size: function () {
return newFile.length;
}
};
}
} callback();
});
}; module.exports = ServersReplaceWebpackPlugin;
然后分别为webpack.dev.conf和webpack.prod.conf添加这个插件。
它的参数就是在gulpfile.js里声明的 global.SERVERS
此系列到此结束。
完结,散花~
【前端】Vue2全家桶案例《看漫画》之七、webpack插件开发——自动替换服务器API-URL的更多相关文章
- 【前端】Vue2全家桶案例《看漫画》之一、添加四个导航页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_1.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之番外篇、express上传漫画(可选)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_extra_1.html 项目github地址:https://github.com/sha ...
- 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_6.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之四、漫画页
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_4.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之二、完成首页基本样式
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_2.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之五、引入axios
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html 项目github地址:https://github.com/shamoyuu/ ...
- 【前端】Vue2全家桶案例《看漫画》之三、引入vuex
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_3.html 项目github地址:https://github.com/shamoyuu/ ...
- Vue2全家桶+Element搭建的PC端在线音乐网站
目录 1,前言 2,已有功能 3,使用 4,目录结构 5,页面效果 登录页 首页 排行榜 歌单列表 歌单详情 歌手列表 歌手详情 MV列表 MV详情 搜索页 播放器 1,前言 项目基于Vue2全家桶及 ...
- Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
本文转载于:https://www.jianshu.com/p/32beaca25c0d 都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到 ...
随机推荐
- php与HTML交互问题
1.将表单中的action属性值设为PHP路径,则网页会跳转到这个网址 <html> <body> <form action="welcome.php" ...
- awk匹配某一段内容,打印第一段
要求: awk 文本在文本中搜索abc搜到后再从搜到的那一行开始一直输出后面的行,直到某一行含有bcd就停止 测试文本: [root@localhost]# cat awktest sadfj sdj ...
- 【转】GLONASS全球卫星导航系统
GLONASS是“GLOBAL NAVIGATION SATELLITE SYSTE(全球卫星导航系统)”的缩写,作用类似于美国的GPS.欧洲的伽利略卫星定位系统.最早开发于苏联时期,后由俄罗斯继续该 ...
- MyCat 入门:漫谈 MyCat 配置系统
文章首发于[博客园-陈树义],点击跳转到原文<MyCat 入门:漫谈 MyCat 配置系统> 上篇文章<MyCat 启蒙:分布式系统的数据库架构演变>中,我们通过一个项目从零到 ...
- vs调试dll工程
dll本身是没法运行的,必须在其它工程调用dll时候才会运行. 所以,调试dll首先要将调用dll的工程和dll工程联系起来. 解决方案中添加dll工程: 现在dll 和 应用程序两个工程就都在一个解 ...
- Zookeeper启动时报8080端口被占用
zookeeper启动时报8080 端口被占用,导致启动失败.特别是服务器上部署了tomcat服务时需要注意. 通过查看zookeeper的官方文档,发现有3种解决途径: (1)删除jetty. (2 ...
- Why Are Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit Deprecated ?
Thread.stop, Thread.suspend, Thread.resume被标记为废弃的方法.在查看JDK的文档时,提到了下面的参考文章,先是英文版,接着是中文翻译. Why is Thre ...
- python3图像识别库安装与使用
pytesseract库的安装 因为用的win10,就直说windows上面的安装了.其实就是pip安装就完事了. $ pip install pytesseract 安装了这个还不算完,得安装Tes ...
- ACE_TEST1.obj : error LNK2019: 无法解析的外部符号
ACE_TEST1.obj : error LNK2019: 无法解析的外部符号 "int __cdecl ace_main_i(int,char * * const)" (?ac ...
- hbuilder ios 打包失败,无法导入p12证书的解决方案
问题描述: 在profile文件和私钥证书通过hbuilder ios 打包成功过的前提下,突然遇到打包失败的问题,问题详情是无法导入p12证书. 探索过程: 本着遇到问题先自省的态度,重复打包了几次 ...