在Node.js中调用webpack+反向代理

    1、:webpack-dev-server可以配置代理;
    2、mockjs:生成随机数据;
    3、:Node.js子进程;
    4、express:Node.js非常好用的应用框架;
    5、:可以把webpack的打包提示信息美观地展现。

    webpack提供了一个Node.js API,能够在Node.js运行时被调用。咱们依然在lesson5的基础上进行代码改造,npm安装express、gulp-util、mockjs

    新建一个app.js

    1. #! /usr/bin/env node --harmony
    2. const fs = require('fs'),
    3. path = require('path'),
    4. gutil = require('gulp-util'),
    5. webpack = require('webpack'),
    6. webpackDevServer = require('webpack-dev-server'),
    7. webpack_config = require('./webpack.config'),
    8. Mock = require('mockjs'),
    9. Random = Mock.Random,
    10. express = require('express'),
    11. app = express();
    12. // 启动webpack-dev-server
    13. const compiler = webpack(webpack_config('development'));
    14. new webpackDevServer(compiler, {
    15. // 这里填写的参数将会插入或者替换webpack.config.js中的原配置
    16. stats: {
    17. colors: true,
    18. chunks: false
    19. },
    20. noInfo: false,
    21. proxy: {
    22. '*': {
    23. target: 'http://localhost:3000',
    24. // 代理到本地3000端口,也就是咱们node运行的端口
    25. }
    26. }
    27. }).listen(8080,function() {console.log('App (dev) is now running on port 8080!');});
    28. // 生成随机数据,测试时非常方便
    29. app.get('/mockData',
    30. function(req, res, next) {
    31. let template = {
    32. "string|1-10": "★",
    33. "number|123.10": 1.123,
    34. 'regexp': /[a-z][A-Z][0-9]/,
    35. 'date': Random.date('yyyy-MM-dd'),
    36. 'image': Random.image(),
    37. 'paragraph': Random.cparagraph()
    38. };
    39. let generateData = Mock.mock(template);
    40. res.send(generateData);
    41. next();
    42. });
    43. app.get('/build',
    44. function(req, res, next) {
    45. webpack(webpack_config('production'),
    46. gutil.log('[webpack:build]', stats.toString({
    47. chunks: false,
    48. colors: true
    49. }));
    50. if (err) {
    51. throw new gutil.PluginError('webpack:build', err);
    52. }
    53. res.send({
    54. success: true
    55. });
    56. next();
    57. });
    58. });
    59. // 监听3000端口
    60. app.listen(3000,function() {console.log('Proxy Server is running on port 3000!');});

    copy以下代码到webpack.config.js,自此不需要用npm命令来打包了,也就可以不需要用到process.env.NODE_ENV的值,为了区分开发和生产环境,这里把webpack.config.js exports成一个函数,并通过传递参数NODE_ENV,最终返回一个配置对象

    copy以下代码到body.html中

    1. <h1 class="body-title">this is body</h1>
    2. <i class="fa fa-cog fa-spin fa-3x fa-fw"></i>
    3. <ul class="body-list">
    4. <li class="body-list-item" id="body-input">你可以使用BannerPlugin给你的每个打包文件加上你的签名<br>webpack教程<br>by kingvid</li>
    5. </ul>
    6. <button id="body-btn" class="btn">点我</button>
    7. <button id="pack-btn" class="btn">打包</button>
    8. <button id="getData-btn" class="btn">获取本地测试数据</button>
    9. <div id="mockData-con"></div>
    10. <div class="mask"><span><i class="fa fa-spinner fa-pulse fa-3x fa-fw"></i></span></div>

    copy以下代码到body.js中

    1. var element = $("#body-input"),
    2. str = element.html(),
    3. progress = 0,
    4. timer = setInterval(() => {
    5. let current = str.substr(progress, 1);
    6. if (current == '<') {
    7. progress = str.indexOf('>', progress) + 1;
    8. } else {
    9. progress++;
    10. }
    11. element.html(str.substring(0, progress) + (progress && 1 ? '_': ''));
    12. if (progress >= str.length) {
    13. clearInterval(timer);
    14. element.html(str.substring(0, progress));
    15. }
    16. },150);
    17. require('../../public/a.js');
    18. $("#body-btn").click(() => {
    19. require.ensure(['../../public/b.js'],
    20. function(require) {
    21. require('../../public/c.js');
    22. });
    23. $(".mask").addClass('active');
    24. $.ajax({
    25. url: '/build',
    26. success: (data) => {
    27. if (data.success) {
    28. alert('打包成功,请查看build文件夹');
    29. } else {
    30. alert('打包失败!');
    31. }
    32. $(".mask").removeClass('active');
    33. }
    34. });
    35. });
    36. $("#getData-btn").click(() => {
    37. $.ajax({
    38. url: '/mockData',
    39. success: (data) => {
    40. let str = '';
    41. str = '<h1>' + data.date + '</h1><ul>';
    42. str += '<li>' + data.string + '</li>' + '<li>' + data.paragraph + '</li>' + '<li>' + data.number + '</li>';
    43. str += '<img src=' + data.image + '>';
    44. $("#mockData-con").append(str);
    45. }
    46. });
    47. });

    运行node app.js,效果如下:

    打包后目录如下:
    《在Node.js中调用webpack+反向代理》 - 图1

    现在开发服务(8080端口)和代理服务(3000端口)是包含在一个进程中了,假设咱们要关闭webpack-dev-server或重启它的话,就会影响到整个进程了,这里咱们可以这样操作,把webpack-dev-server放到Node.js的一个子进程里面去,如果要关闭webpack-dev-server的话,就不会影响到主进程了。
    新建一个webpackDevServer.js文件

    1. touch webpackDevServer.js

    copy进去以下代码

    1. const webpack = require('webpack');
    2. const webpack_config = require('./webpack.config');
    3. const webpackDevServer = require('webpack-dev-server');
    4. //webpack dev server
    5. const compiler = webpack(webpack_config('development'));
    6. new webpackDevServer(compiler, {
    7. stats: {
    8. colors: true,
    9. chunks: false
    10. },
    11. noInfo: false,
    12. proxy: {
    13. '*': {
    14. target: 'http://localhost:3000',
    15. }
    16. }
    17. }).listen(8080,
    18. function() {
    19. console.log('App (dev) is now running on port 8080!');
    20. });

    运行node app.js,效果如上,页面运行顺利。