转载请注明出处: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,为我们的服务器地址设置一个占位符

  1. let apiUrl = "<<<service>>>";
  2. let picServer = "<<<pic-service>>>";
  3.  
  4. console.info("apiUrl", apiUrl);
  5. console.info("picServer", picServer);

因为对js的压缩不会压缩字符串,所以我们就可以通过替换占位符来做到我们上面提到的功能。

然后我们新建一个server.json文件,来保存我们各个平台,各个环境下的服务器地址

  1. {
  2. "webapp": {
  3. "environments": {
  4. "dev": {
  5. "service": "http://localhost:18080/iconan",
  6. "pic-service": "http://iconan.bj.bcebos.com"
  7. },
  8. "test": {
  9. "service": "http://meleong.duapp.com/iconan",
  10. "pic-service": "http://iconan.bj.bcebos.com"
  11. },
  12. "production": {
  13. "service": "/iconan",
  14. "pic-service": "http://iconan.bj.bcebos.com"
  15. }
  16. }
  17. },
  18. "mobile": {
  19. "environments": {
  20. "dev": {
  21. "service": "http://localhost:18080/iconan",
  22. "pic-service": "http://iconan.bj.bcebos.com"
  23. },
  24. "test": {
  25. "service": "http://meleong.duapp.com/iconan",
  26. "pic-service": "http://iconan.bj.bcebos.com"
  27. },
  28. "production": {
  29. "service": "http://meleong.duapp.com/iconan",
  30. "pic-service": "http://iconan.bj.bcebos.com"
  31. }
  32. }
  33. }
  34. }

这样就可以一目了然,想修改也特别方便。

然后我们修改gulpfile.js,先来通过指令的参数获取到我们想要的服务器地址

  1. const serverConfig = require(process.cwd() + "/server.json");
  2. global.SERVERS = serverConfig[args.t]["environments"][args.e];

然后我们来替换,如果是用gulp的管道的话,可以这么写,修改webpack.build文件

  1. "webpack.build": (done) => {
  2. let spinner = ora("正在打包,请稍后...");
  3. spinner.start();
  4. webpack(webpackConfig, (err, stats) => {
  5. spinner.stop();
  6. if (err) throw err;
  7. process.stdout.write(stats.toString({
  8. colors: true,
  9. modules: false,
  10. children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
  11. chunks: false,
  12. chunkModules: false
  13. }) + "\n\n");
  14.  
  15. if (stats.hasErrors()) {
  16. console.log(chalk.red(" 构建出错。\n"));
  17. process.exit();
  18. }
  19.  
  20. // let stream = gulp.src(["dist/**/*"]);
  21. // let servers = serverConfig[args.t]["environments"][args.e];
  22. // for (let key in servers) {
  23. // stream = stream.pipe(replace("<<<" + key + ">>>", servers[key]))
  24. // }
  25. // stream.pipe(gulp.dest("dist"))
  26. // .on('end', function () {
  27. // console.log(chalk.cyan(" 构建完成。\n"));
  28. // done();
  29. // });
  30.  
  31. done();
  32. });
  33. },

就是图里注释掉的那段。但是这样在开发环境下不可用,因为我们是用webpack配置的开发环境,如果你用的是gulp,可以这么做。

所以我们给webpack写一个插件来实现这个功能。

首先我们修改dev任务

  1. const webpackDevConfig = require(process.cwd() + "/build/webpack.dev.conf");
  2.  
  3. "dev": () => {
  4. let devCompiler = webpack(webpackDevConfig);
  5.  
  6. new WebpackDevServer(devCompiler)
  7. .listen(webpackDevConfig.devServer.port, webpackDevConfig.devServer.host, function (err) {
  8. if (err) throw new gutil.PluginError("webpack-dev-server", err);
  9. console.log(chalk.cyan(" 服务已启动\n"));
  10. });
  11. }

然后修改webpack.dev.conf最后的exports = devWebpackConfig,不要返回那个Promise。

然后我们写一个插件,新建build/plugin/servers-replace-webpack-plugin.js文件

  1. function ServersReplaceWebpackPlugin(options) {
  2. this.options = options;
  3. }
  4.  
  5. ServersReplaceWebpackPlugin.prototype.apply = function (compiler) {
  6. let that = this;
  7.  
  8. compiler.plugin('emit', function (compilation, callback) {
  9. // 检查所有编译好的资源文件,替换所有需要替换的地方
  10. for (var filename in compilation.assets) {
  11. if (filename.endsWith(".js")) {
  12. console.info("filename =", filename);
  13. let newFile = compilation.assets[filename].source().toString();
  14.  
  15. let servers = that.options;
  16. for (let key in servers) {
  17. newFile = newFile.replace("<<<" + key + ">>>", servers[key]);
  18. }
  19.  
  20. compilation.assets[filename] = {
  21. source: function () {
  22. return newFile;
  23. },
  24. size: function () {
  25. return newFile.length;
  26. }
  27. };
  28. }
  29. }
  30.  
  31. callback();
  32. });
  33. };
  34.  
  35. module.exports = ServersReplaceWebpackPlugin;

然后分别为webpack.dev.conf和webpack.prod.conf添加这个插件。

它的参数就是在gulpfile.js里声明的 global.SERVERS

此系列到此结束。

完结,散花~

【前端】Vue2全家桶案例《看漫画》之七、webpack插件开发——自动替换服务器API-URL的更多相关文章

  1. 【前端】Vue2全家桶案例《看漫画》之一、添加四个导航页

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_1.html 项目github地址:https://github.com/shamoyuu/ ...

  2. 【前端】Vue2全家桶案例《看漫画》之番外篇、express上传漫画(可选)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_extra_1.html 项目github地址:https://github.com/sha ...

  3. 【前端】Vue2全家桶案例《看漫画》之六、图片阅读页

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_6.html 项目github地址:https://github.com/shamoyuu/ ...

  4. 【前端】Vue2全家桶案例《看漫画》之四、漫画页

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_4.html 项目github地址:https://github.com/shamoyuu/ ...

  5. 【前端】Vue2全家桶案例《看漫画》之二、完成首页基本样式

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_2.html 项目github地址:https://github.com/shamoyuu/ ...

  6. 【前端】Vue2全家桶案例《看漫画》之五、引入axios

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_5.html 项目github地址:https://github.com/shamoyuu/ ...

  7. 【前端】Vue2全家桶案例《看漫画》之三、引入vuex

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux_app_3.html 项目github地址:https://github.com/shamoyuu/ ...

  8. Vue2全家桶+Element搭建的PC端在线音乐网站

    目录 1,前言 2,已有功能 3,使用 4,目录结构 5,页面效果 登录页 首页 排行榜 歌单列表 歌单详情 歌手列表 歌手详情 MV列表 MV详情 搜索页 播放器 1,前言 项目基于Vue2全家桶及 ...

  9. Vue2全家桶之一:vue-cli(vue脚手架)超详细教程

    本文转载于:https://www.jianshu.com/p/32beaca25c0d   都说Vue2简单上手容易,的确,看了官方文档确实觉得上手很快,除了ES6语法和webpack的配置让你感到 ...

随机推荐

  1. MySQL相关文档索引

    MySQL的新功能5.7 https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html MySQL5.7安装 http://note.youd ...

  2. 关于Spring的注入方式

      spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire=" ...

  3. diff和patch命令(1)

    1. diff是对两个集合的差运算,patch是对两个集合的和运算. 2. diff以逐行的方式,比较文本文件的异同处.所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录 ...

  4. Java NIO之网络编程

    最近在研究Java NIO和netty,曾经一度感觉很吃力,根本原因还是对操作系统.TCP/IP.socket编程的理解不到位. 不禁感叹,还是当初逃的课太多. 假如上天给我一次机会,能够再回到意气风 ...

  5. DIV+CSS中的滤镜和模糊

    在div+css中,经常会用到div和span 当内容比较多的时候,会用到div 当内容比较少的时候,会用到span 来看下面的代码: <!DOCTYPE html> <html&g ...

  6. python中math模块常用的方法整理

    ceil:取大于等于x的最小的整数值,如果x是一个整数,则返回x copysign:把y的正负号加到x前面,可以使用0 cos:求x的余弦,x必须是弧度 degrees:把x从弧度转换成角度 e:表示 ...

  7. java导入项目有红色叹号

    原因:缺少jar包 解决:         选中项目  ->  右键  -> Build Path  -> Configer Builder Path  ->  删除掉有错的J ...

  8. 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zj ...

  9. iterator和for of 循环

    JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就有了四种数据集合,用户还可以组合使用它们, ...

  10. Vs Code JavaScript开发插件推荐

    1 vscode-icons 使用效果 安装好后如何设置? Ctrl+Shift+P 然后输入theme 2 document this 如何使用? 在方法或者要注释的地方上 按 快捷键 Ctrl + ...