使用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 相关文章推荐
jquery showModelDialog的使用方法示例详解
Nov 19 Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
关于Stream和Buffer的相互转换详解
Jul 26 Javascript
bootstrap fileinput实现文件上传功能
Aug 23 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
详解webpack模块化管理和打包工具
Apr 21 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
vue+axios实现文件下载及vue中使用axios的实例
Sep 21 Javascript
详解微信小程序与内嵌网页交互实现支付功能
Oct 22 Javascript
微信小程序websocket实现即时聊天功能
May 21 Javascript
解决ant Design中Select设置initialValue时的大坑
Oct 29 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 IPV6正则表达式验证代码
2010/02/16 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
PHP常用处理静态操作类
2015/04/03 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
2011/10/30 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
ES6 class的应用实例分析
2019/06/27 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
python分析apache访问日志脚本分享
2015/02/26 Python
python实现web方式logview的方法
2015/08/10 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Python数据存储之 h5py详解
2019/12/26 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
建议书标准格式
2014/03/12 职场文书
元旦联欢会主持词
2014/03/26 职场文书
计算机专业自荐信
2014/05/24 职场文书
经营目标管理责任书
2014/07/25 职场文书
商铺租房协议书范本
2014/12/04 职场文书
大学生团员个人总结
2015/02/14 职场文书
新闻通讯稿模板
2015/07/22 职场文书
老生常谈 使用 CSS 实现三角形的技巧(多种方法)
2021/04/13 HTML / CSS
JS Canvas接口和动画效果大全
2021/04/29 Javascript
用php如何解决大文件分片上传问题
2021/07/07 PHP