使用webpack打包koa2 框架app


Posted in Javascript onFebruary 02, 2018

以前在用koa写server的时候,发布简直是噩梦。需要将src里面的全部文件都覆盖掉,config配置文件也要覆盖,稍有不慎就会线上报各种各样的问题,然后就得回退,本地调好在发布。偶然看见一篇文章讲 如何使用webpack打包koa app ,惊为天人,原来webpack也能打包后台。这在以前想都没想过。

关键问题

一:所有node_modules里的模块都不进行打包

webpack的核心功能是将引用的各个模块打到一个文件里,并会将各种规范的模块进行统一的模块化处理(webpack规范)。

然而node中包含大量的fs、path操作,这些fs和path操作在打包完成后将没有操作对象,还会报出很多各样的错误。

所以使用webpack打包的核心就是拒绝打包一切node_modules里的模块,只是将相对路径引用的文件打包到一个文件里。恰巧我们发现webapck提供externals属性来排除掉不需要打包的模块。

再深入点我们可以发现:像webpack、nodemon、babel-preset-env这样的模块是app开发环境依赖的包,我们的程序里根本不会require这些模块。

综上可以发现:我们只将所有require到的包排除掉就可以了,这个模块对应的也就是package.json里dependencies下的模块。有关dependencies和devDependencies的区别要理解好。

因此我们可以使用externals-dependencies这个插件配合externals属性实现dependencies的排除工作。

代码:

const webpack = require('webpack');
const _externals = require('externals-dependencies')
module.exports = {
  ...
  externals: _externals(),
  ...
}

二:target指向node

官方文档:编译为类 Node.js 环境可用(使用 Node.js require 加载 chunk)

代码:

target: 'node',

三:增加node配置

官方文档:这些选项可以配置是否 polyfill 或 mock 某些 Node.js全局变量和模块。这可以使最初为 Node.js 环境编写的代码,在其他环境(如浏览器)中运行。

代码:

node: {
    console: true,
    global: true,
    process: true,
    Buffer: true,
    __filename: true,
    __dirname: true,
    setImmediate: true,
    path: true
},

四:babel配置

为了兼容低版本的node不原生支持async/await的问题。这里babel我使用了babel-preset-env{"modules": false}的配置。此配置会将es6语法转为es5语法,例如let、const转为var。

同时将所有的async/await函数也转成了polyfill里定义的_asyncToGenerator函数。

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

其实是使用promise实现了async函数的功能。

当然这个函数在运行时还需要regeneratorRuntime函数。所以我在全局引入了babel-polyfill来提供regeneratorRuntime函。

注:如果你的node版本很高且原生支持async/await,大可将babel-preset-env和babel-polyfill省略掉

代码:

const path = require('path');
const webpack = require('webpack');
const _externals = require('externals-dependencies')

module.exports = {
  entry: {
    app: [
      // 如果polyfill放在这里,打包的时候将不会被external,必须在js里require才能有效external
      // 'babel-polyfill',
      './src/index.js'
    ]
  },
  output: {
    path: path.resolve(__dirname),
    filename: '[name].js'
  },
  resolve: {
    extensions: [".js"]
  },
  target: 'node',
  externals: _externals(),
  context: __dirname,
  node: {
    console: true,
    global: true,
    process: true,
    Buffer: true,
    __filename: true,
    __dirname: true,
    setImmediate: true,
    path: true
  },
  module: {
    rules: [
      {
        test: /\.js/,
        use: ['babel-loader']
      }
    ]
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: '"development"'
      }
    }),
  ]
}

部署

经过打包,部署的时候就方便多了,只需要将package.json、app.js、以及view里的html部署上线就好了。然后在服务器上执行

1. npm install
2. npm run for

然后server就后台运行了。如果需要更新发布,只需要本地重新npm run dev或npm run build打好包,拖到服务器覆盖app.js即可。

Javascript 相关文章推荐
向大师们学习Javascript(视频与PPT)
Dec 27 Javascript
网页中表单按回车就自动提交的问题的解决方案
Nov 03 Javascript
Javascript中prototype属性实现给内置对象添加新的方法
May 14 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
vue.js+boostrap项目实践(案例详解)
Sep 21 Javascript
JavaScript实现经典排序算法之选择排序
Dec 28 Javascript
vue.js做一个简单的编辑菜谱功能
May 08 Javascript
iView框架问题整理小结
Oct 16 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
jQuery实现轮播图效果
Nov 26 jQuery
uniapp 微信小程序 自定义tabBar 导航
Apr 22 Javascript
Vue组件化开发思考
Feb 02 #Javascript
微信小程序实现导航栏选项卡效果
Jun 19 #Javascript
解析Vue.js中的组件
Feb 02 #Javascript
如何将你的AngularJS1.x应用迁移至React的方法
Feb 01 #Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 #Javascript
js中getBoundingClientRect的作用及兼容方案详解
Feb 01 #Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 #Javascript
You might like
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
ThinkPHP采用模块和操作分析
2011/04/18 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
Array.prototype.slice 使用扩展
2010/06/09 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python算法应用实战之栈详解
2017/02/04 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
django-初始配置(纯手写)详解
2019/07/30 Python
python梯度下降算法的实现
2020/02/24 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
编辑找工作求职信范文
2013/12/16 职场文书
电信营业员自我评价分享
2014/01/17 职场文书
环保倡议书
2014/04/14 职场文书
年度安全生产目标责任书
2014/07/23 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015社区精神文明建设工作总结
2015/04/21 职场文书