91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用webpack打包koa2 框架app

發布時間:2020-10-09 21:18:39 來源:腳本之家 閱讀:130 作者:哈哈TT 欄目:web開發

以前在用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即可。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凌海市| 黔江区| 平南县| 浑源县| 汝城县| 巢湖市| 东乡县| 临漳县| 新丰县| 三门县| 西吉县| 兴国县| 澜沧| 枞阳县| 佛学| 京山县| 阜康市| 汨罗市| 裕民县| 庆安县| 九龙坡区| 庆城县| 时尚| 新平| 岚皋县| 西盟| 甘泉县| 卓尼县| 安国市| 保定市| 宣武区| 博湖县| 堆龙德庆县| 甘肃省| 师宗县| 信阳市| 新河县| 清新县| 丰镇市| 阳东县| 贵德县|