使用webpack打包koa2 框架app
以前在用koa寫server的時(shí)候,發(fā)布簡(jiǎn)直是噩夢(mèng)。需要將src里面的全部文件都覆蓋掉,config配置文件也要覆蓋,稍有不慎就會(huì)線上報(bào)各種各樣的問題,然后就得回退,本地調(diào)好在發(fā)布。偶然看見一篇文章講 如何使用webpack打包koa app ,驚為天人,原來(lái)webpack也能打包后臺(tái)。這在以前想都沒想過。
關(guān)鍵問題
一:所有node_modules里的模塊都不進(jìn)行打包
webpack的核心功能是將引用的各個(gè)模塊打到一個(gè)文件里,并會(huì)將各種規(guī)范的模塊進(jìn)行統(tǒng)一的模塊化處理(webpack規(guī)范)。
然而node中包含大量的fs、path操作,這些fs和path操作在打包完成后將沒有操作對(duì)象,還會(huì)報(bào)出很多各樣的錯(cuò)誤。
所以使用webpack打包的核心就是拒絕打包一切node_modules里的模塊,只是將相對(duì)路徑引用的文件打包到一個(gè)文件里。恰巧我們發(fā)現(xiàn)webapck提供externals屬性來(lái)排除掉不需要打包的模塊。
再深入點(diǎn)我們可以發(fā)現(xiàn):像webpack、nodemon、babel-preset-env這樣的模塊是app開發(fā)環(huán)境依賴的包,我們的程序里根本不會(huì)require這些模塊。
綜上可以發(fā)現(xiàn):我們只將所有require到的包排除掉就可以了,這個(gè)模塊對(duì)應(yīng)的也就是package.json里dependencies下的模塊。有關(guān)dependencies和devDependencies的區(qū)別要理解好。
因此我們可以使用externals-dependencies這個(gè)插件配合externals屬性實(shí)現(xiàn)dependencies的排除工作。
代碼:
const webpack = require('webpack');
const _externals = require('externals-dependencies')
module.exports = {
...
externals: _externals(),
...
}
二:target指向node
官方文檔:編譯為類 Node.js 環(huán)境可用(使用 Node.js require 加載 chunk)
代碼:
target: 'node',
三:增加node配置
官方文檔:這些選項(xiàng)可以配置是否 polyfill 或 mock 某些 Node.js全局變量和模塊。這可以使最初為 Node.js 環(huán)境編寫的代碼,在其他環(huán)境(如瀏覽器)中運(yùn)行。
代碼:
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}的配置。此配置會(huì)將es6語(yǔ)法轉(zhuǎn)為es5語(yǔ)法,例如let、const轉(zhuǎn)為var。
同時(shí)將所有的async/await函數(shù)也轉(zhuǎn)成了polyfill里定義的_asyncToGenerator函數(shù)。
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"); }); }; }
其實(shí)是使用promise實(shí)現(xiàn)了async函數(shù)的功能。
當(dāng)然這個(gè)函數(shù)在運(yùn)行時(shí)還需要regeneratorRuntime函數(shù)。所以我在全局引入了babel-polyfill來(lái)提供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放在這里,打包的時(shí)候?qū)⒉粫?huì)被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"'
}
}),
]
}
部署
經(jīng)過打包,部署的時(shí)候就方便多了,只需要將package.json、app.js、以及view里的html部署上線就好了。然后在服務(wù)器上執(zhí)行
1. npm install
2. npm run for
然后server就后臺(tái)運(yùn)行了。如果需要更新發(fā)布,只需要本地重新npm run dev或npm run build打好包,拖到服務(wù)器覆蓋app.js即可。
- Node.js?網(wǎng)絡(luò)框架koa?compose中間件使用解析
- 如何從頭實(shí)現(xiàn)一個(gè)node.js的koa框架
- node.js學(xué)習(xí)筆記之koa框架和簡(jiǎn)單爬蟲練習(xí)
- 利用Node.js+Koa框架實(shí)現(xiàn)前后端交互的方法
- Node.js的Koa框架上手及MySQL操作指南
- 淺談Koa2框架利用CORS完成跨域ajax請(qǐng)求
- nuxt框架中路由鑒權(quán)之Koa和Session的用法
- 基于Koa(nodejs框架)對(duì)json文件進(jìn)行增刪改查的示例代碼
- koa框架的原理、功能,與基本使用方法概述
相關(guān)文章
關(guān)于node-bindings無(wú)法在Electron中使用的解決辦法
今天小編就為大家分享一篇關(guān)于關(guān)于node-bindings無(wú)法在Electron中使用的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Node.js一行代碼實(shí)現(xiàn)靜態(tài)文件服務(wù)器的方法步驟
這篇文章主要介紹了Node.js一行代碼實(shí)現(xiàn)靜態(tài)文件服務(wù)器的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Sequelize中用group by進(jìn)行分組聚合查詢
大家都知道在SQL查詢中,分組查詢是較常用的一種查詢方式。分組查詢是指通過GROUP BY關(guān)鍵字,將查詢結(jié)果按照一個(gè)或多個(gè)字段進(jìn)行分組,分組時(shí)字段值相同的會(huì)被分為一組。在Node.js基于Sequelize的ORM框架中,同樣支持分組查詢,使用非常簡(jiǎn)單方便。下面來(lái)看看詳細(xì)的介紹。2016-12-12
node.js express框架實(shí)現(xiàn)文件上傳與下載功能實(shí)例詳解
這篇文章主要介紹了node.js express框架實(shí)現(xiàn)文件上傳與下載功能,結(jié)合具體實(shí)例形式詳細(xì)分析了node.js express框架針對(duì)文件上傳與下載的前后臺(tái)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-10-10
node npm yarn報(bào)錯(cuò)error:不是內(nèi)部或外部命令
文章介紹了如何安裝和配置Node.js、npm和yarn,并解決無(wú)法正常使用的問題,主要步驟包括:正確安裝環(huán)境變量、配置用戶變量和系統(tǒng)變量、設(shè)置全局安裝模塊和緩存目錄的環(huán)境變量,以及手動(dòng)配置yarn的環(huán)境變量2024-11-11

