使用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 相关文章推荐
js显示时间 js显示最后修改时间
Jan 02 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
Oct 29 Javascript
json与jsonp知识小结(推荐)
Aug 16 Javascript
Javascript 引擎工作机制详解
Nov 30 Javascript
node使用Koa2搭建web项目的方法
Oct 17 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
微信小程序radio组件使用详解
Jan 31 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
详解在create-react-app使用less与antd按需加载
Dec 06 Javascript
关于layui 下拉列表的change事件详解
Sep 20 Javascript
ES5新增数组的实现方法
May 12 Javascript
vue接通后端api以及部署到服务器操作
Aug 13 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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
JavaScript中数据结构与算法(二):队列
2015/06/19 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
vue轮播图插件vue-awesome-swiper
2017/11/27 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
如何正确理解vue中的key详解
2019/11/02 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python函数中的可变长参数详解
2019/09/12 Python
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
个人简历自我评价八例
2013/10/31 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
数学教学随笔感言
2014/02/17 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
梅花魂教学反思
2014/04/25 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL
springboot用户数据修改的详细实现
2022/04/06 Java/Android