Webpack 服务器端代码打包的示例代码


Posted in Javascript onSeptember 19, 2017

环境变量

之前,我们在项目里会经常使用 process.env.NODE_ENV, 但这个变量对于 webpack打包是有影响的, 在 production 的时候是有优化的.

所以, 我们将改用其他的环境变量来区别:

new webpack.DefinePlugin({
 'process.env.NODE_ENV': '"production"',
 'process.env.API_ENV': `"${process.env.API_ENV || 'development'}"`
})

像这样, NODE_ENV 始终为 production.

而我们实际开发/产品环境, 用 process.env.API_ENV 变量来使用(由于该项目是一个 koa 接口服务项目, 所以这样进行命名, 可以改成任意的, 你开心就好).

动态配置打包

注意

我们以前在 node.js 后端项目中, 动态配置加载一般是这样写:

const ENV = process.env.NODE_ENV || 'development';
// eslint-disable-next-line import/no-dynamic-require
const options = require(`./_${ENV}`);

module.exports = options;

为了提高阅读性, 和可能存在ENV的复用, 我们会单独定义一个变量.

在 webpack 打包的项目中直接这样做的话, 会产生一个问题. 比如我现在有多个配置:

  • _develpment.js
  • _test.js
  • _production.js
  • _staging.js

即便我传入的当前环境为 development, 依然所有的配置文件会被全部打包进来(只是永远不会被执行). 那么这样的话, 就存在敏感信息泄露的风险.

正确的姿势应该是这样的:

config/index.js

// eslint-disable-next-line import/no-dynamic-require
const options = require(`./_${process.env.API_ENV || 'development'}`);

module.exports = options;

模块化打包

比如, 我在项目中有很多个模块, 处于负载均衡的需求, 或者是对于客户定制模块化产品的需求, 我们需要分模块进行打包, 避免其他模块(永远不会被执行的)被打包进 webpack bundle.

// config/_development.js
exports.enabledModules = ['user', 'demo']; 
// 可能 src 目录下 还有其他模块目录, 如 'manage' 等

在服务端加载的时候, 是这样子的:

// src/server.js
// 动态加载启用的模块
enabledModules.forEach((mod) => {
 /* eslint-disable global-require,import/no-dynamic-require */
 const routes = require(`./${mod}/route`);
 routes.middleware() |> app.use;
});

那么就需要 ContextReplacementPlugin 插件来支持了.

new webpack.ContextReplacementPlugin(/src/, new RegExp(`^./(${enabledModules.join('|')})/.*$`))

进阶使用

比如,src目录下除了各个模块的目录, 还有一些通用方法类,钩子的目录, 如: lib 和 hook. 这两个目录是可能被其他子模块共同引用的. 在插件正则中修改:

new webpack.ContextReplacementPlugin(/src/, new RegExp(`^./(lib|hook|${enabledModules.join('|')})/.*$`))

压缩代码, 并添加 source-map 支持

Uglifyjs 或 Uglify-es 其实对于服务器端代码打包并不友好, 可能会导致打包的失败, 用 babel-minify-webpack-plugin 插件来替代.

配合 source-map-support 插件来支持源码的问题定位.

示例项目源码: https://github.com/AirDwing/webpack-server-bundle

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Perfection kill 测试及答案
Mar 23 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
Apr 07 Javascript
浅谈JS中的bind方法与函数柯里化
Aug 10 Javascript
jquery点击切换背景色的简单实例
Aug 25 Javascript
详解Node.js实现301、302重定向服务
Apr 07 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
Nov 27 Javascript
iview table高度动态设置方法
Mar 14 Javascript
Node.js Event Loop各阶段讲解
Mar 08 Javascript
vue发送websocket请求和http post请求的实例代码
Jul 11 Javascript
详解Vue 单文件组件的三种写法
Feb 19 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
Jun 02 Javascript
原生js中ajax访问的实例详解
Sep 19 #Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 #Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 #Javascript
前端常见跨域解决方案(全)
Sep 19 #Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 #Javascript
JavaScript数组去重的多种方法(四种)
Sep 19 #Javascript
一步步教你利用Canvas对图片进行处理
Sep 19 #Javascript
You might like
php miniBB中文乱码问题解决方法
2008/11/25 PHP
PHP 数组教程 定义数组
2009/10/23 PHP
php 缩略图实现函数代码
2011/06/23 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
Python基于动态规划算法计算单词距离
2015/07/25 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
python邮件发送smtplib使用详解
2020/06/16 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
python退出循环的方法
2020/06/18 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
英语系本科生求职信范文
2013/12/18 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
就业协议书范本
2014/10/08 职场文书
行风评议整改报告
2014/11/06 职场文书
2016年教师党员公开承诺书
2016/03/24 职场文书
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
python语言中pandas字符串分割str.split()函数
2022/08/05 Python