使用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实现读取txt文档的脚本
Jul 20 Javascript
JavaScript 获取事件对象的注意点
Jul 29 Javascript
最简单的js图片切换效果实现代码
Sep 24 Javascript
JS localStorage实现本地缓存的方法
Jun 22 Javascript
jquery中ajax跨域方法实例分析
Dec 18 Javascript
Angular.Js中ng-include指令的使用与实现
May 07 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
Oct 19 Javascript
node的process以及child_process模块学习笔记
Mar 06 Javascript
JavaScript多种滤镜算法实现代码实例
Dec 10 Javascript
vue实现图片懒加载的方法分析
Feb 05 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
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实现json_decode不转义中文的方法
2017/05/20 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
jQuery自动完成插件completer附源码下载
2016/01/04 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
移动端web滚动分页的实现方法
2017/05/05 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
Vue中添加滚动事件设置的方法详解
2020/09/14 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
Python中typing模块与类型注解的使用方法
2019/08/05 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
一个入门级python爬虫教程详解
2021/01/27 Python
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
白酒业务员岗位职责
2013/12/27 职场文书
小学数学教学反思
2014/02/02 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
大班亲子运动会方案
2014/06/10 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
授权委托书(法人单位用)
2014/09/29 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
MySQL读取JSON转换的方式
2022/03/18 MySQL