【前端】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的配置让你感到 ...
随机推荐
- MySQL相关文档索引
MySQL的新功能5.7 https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html MySQL5.7安装 http://note.youd ...
- 关于Spring的注入方式
spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...
- diff和patch命令(1)
1. diff是对两个集合的差运算,patch是对两个集合的和运算. 2. diff以逐行的方式,比较文本文件的异同处.所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录 ...
- Java NIO之网络编程
最近在研究Java NIO和netty,曾经一度感觉很吃力,根本原因还是对操作系统.TCP/IP.socket编程的理解不到位. 不禁感叹,还是当初逃的课太多. 假如上天给我一次机会,能够再回到意气风 ...
- DIV+CSS中的滤镜和模糊
在div+css中,经常会用到div和span 当内容比较多的时候,会用到div 当内容比较少的时候,会用到span 来看下面的代码: <!DOCTYPE html> <html&g ...
- python中math模块常用的方法整理
ceil:取大于等于x的最小的整数值,如果x是一个整数,则返回x copysign:把y的正负号加到x前面,可以使用0 cos:求x的余弦,x必须是弧度 degrees:把x从弧度转换成角度 e:表示 ...
- java导入项目有红色叹号
原因:缺少jar包 解决: 选中项目 -> 右键 -> Build Path -> Configer Builder Path -> 删除掉有错的J ...
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zj ...
- iterator和for of 循环
JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用户还可以组合使用它们, ...
- Vs Code JavaScript开发插件推荐
1 vscode-icons 使用效果 安装好后如何设置? Ctrl+Shift+P 然后输入theme 2 document this 如何使用? 在方法或者要注释的地方上 按 快捷键 Ctrl + ...