国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
NodeJS打包可執(zhí)行文件工具Pkg使用心得。
這個(gè)項(xiàng)目很神奇,直接將node.js項(xiàng)目打包成windows可以直接執(zhí)行的exe文件(也支持FreeBSD、linux、macos、arm系統(tǒng)),甚至不需要安裝Node.js,且無(wú)須修改你項(xiàng)目中的任何代碼!
首先安裝pkg
npm install -g pkg
然后在項(xiàng)目目錄下執(zhí)行
pkg entrance.js
即可打包linux,macos,win3個(gè)平臺(tái)的可執(zhí)行文件。entrance.js為你node項(xiàng)目的入口文件。
如果只想打包windows下的exe,則加上-t參數(shù)。win即為打包成windows平臺(tái)下的exe文件,具體可選參數(shù)參見(jiàn)項(xiàng)目目錄
pkg -t win entrance.js
稍等片刻后項(xiàng)目目錄下就會(huì)生成打包好的entrance.exe文件。
pkg會(huì)自動(dòng)從入口文件開(kāi)始查找依賴的文件并全數(shù)打包進(jìn)去,無(wú)須修改項(xiàng)目里的任何代碼。
例:
其他
pkg可以根據(jù)package.json下的配置進(jìn)行打包,默認(rèn)入口文件為bin指向的文件。
執(zhí)行
pkg .
或是
pkg package.json
即可自動(dòng)按照package.json的配置打包。
//package.json{    //其他配置項(xiàng)
   "bin": "service.js",//入口文件
   "pkg": {        "scripts": [            "build/**/*.js"http://需要打包進(jìn)來(lái)的其他js文件,可添加多個(gè)
       ],        "assets": [            "dist/**/*"http://靜態(tài)文件的目錄,可添加多個(gè)
       ]
   }
}    
注意:靜態(tài)文件需要在項(xiàng)目中將文件的引用換成
path.join(__dirname, 'dist')
的形式,才可以正常打包,否則可能會(huì)讀取不到。
示例
使用vue-cli建立項(xiàng)目,并使用npm run build將你的項(xiàng)目編譯生成靜態(tài)文件到dist目錄下。這些都是vue-cli自帶的內(nèi)容,不再贅述。
在項(xiàng)目目錄下新建一個(gè)service.js文件,并添加以下代碼,在本地起一個(gè)express靜態(tài)服務(wù)器,使你能夠在本地訪問(wèn)你的網(wǎng)站(部署到線上也是類似)
//service.jsconst express = require('express');const app = express();const path = require('path');

app.use(express.static(path.join(__dirname, 'dist')));//注意這里使用path.join(__dirname, 'dist')而不是'dist',雖然在命令行中執(zhí)行起來(lái)效果是一樣的,不過(guò)pkg打包會(huì)無(wú)法識(shí)別到dist目錄
var server = app.listen(8081, function () {    var host = server.address().address    var port = server.address().port    console.log(`AIbuy agents server start successfully on http://${host}:${port}`)
})
此時(shí)你可以在控制臺(tái)執(zhí)行
node service.js
來(lái)啟動(dòng)你的服務(wù)器了,啟動(dòng)完成后,瀏覽器訪問(wèn)http://localhost:8081/即可查看你的網(wǎng)站。
接下來(lái)我們使用將service.js和dist目錄打包成一個(gè)exe文件,方便他人使用
首先安裝pkg
npm install -g pkg
然后修改package.json,添加bin(如果不是service.js的話)和pkg項(xiàng)
{    //其他配置項(xiàng)
   "bin": "service.js",//指定入口文件
   "pkg": {        "assets": [            "dist/**/*"http://指定要打包的靜態(tài)文件目錄
       ]
   }
}
然后在項(xiàng)目目錄下執(zhí)行
pkg -t win package.json
完成后即生成一個(gè)exe文件,雙擊啟動(dòng)即相當(dāng)于執(zhí)行node service.js,然后你瀏覽器里就能訪問(wèn)打包好的項(xiàng)目了!跟之前用node啟動(dòng)項(xiàng)目再訪問(wèn)一樣,但這時(shí)不需要提前安裝node了。
但說(shuō)實(shí)話,如果是復(fù)雜的項(xiàng)目、大型的項(xiàng)目、有文件讀寫的項(xiàng)目等,打包這個(gè)操作還是有些復(fù)雜的,需要考慮不少打包帶來(lái)的影響,也可能需要修改某些功能代碼。如果是用于代碼保護(hù)目的,防止發(fā)布后別人看到自己的程序代碼,也可以用JShaman之類的JS代碼保護(hù)平臺(tái)對(duì)源碼進(jìn)行加密,也是可以保護(hù)nodeJS代碼的。
下面是一個(gè)具體的示例,演示使用pkg打包egg(一個(gè)web框架)項(xiàng)目:
1、在egg配置文件中把涉及到寫文件的路徑都移到包外(pkg的虛擬文件系統(tǒng)只是用來(lái)應(yīng)對(duì)讀的行為,所有寫相關(guān)都得移出包外)
// 通過(guò)process.cwd()獲取當(dāng)前執(zhí)行文件執(zhí)行的路徑config.rundir = process.cwd() + '/run';// 配置執(zhí)行時(shí)臨時(shí)文件的路徑config.logger = {
   dir: path.join(process.cwd(), 'logs', logDir),//配置普通日志文件地址
 };  config.customLogger = {
   scheduleLogger: {
     file: path.join(process.cwd(), 'logs', logDir, 'egg-schedule.log'),//配置定時(shí)任務(wù)日志的地址
   },
 };  config.static = { // 必須把public移出項(xiàng)目,否則在pkg的包中egg的static中間件會(huì)有對(duì)public操作(確保文件夾),會(huì)有拋錯(cuò)
   prefix: '/',
   dir: process.cwd() + '/public',//配置靜態(tài)文件的地址
 };
2、修改package.json文件
{
   ...


 "bin": "pkg-entry.js", // 執(zhí)行包的入口文件,可執(zhí)行包啟動(dòng)的時(shí)候默認(rèn)會(huì)調(diào)用該文件

 "pkg": {// 以下主要是聲明那些文件需要被打包(pkg會(huì)解析require中的靜態(tài)路徑,但在egg.js中很多文件都是通過(guò)框架引用的,無(wú)法依賴解析)
   "scripts": [ // 這里是聲明需要打包的js文件,這里的聲明的js文件都會(huì)被編譯為v8字節(jié)碼(建議主動(dòng)聲明,不要依賴pkg自動(dòng)引入)
     "./app/**/*.js",      "./config/**/*.js",      "./normalJs/**/*.js", // 不只是egg的文件,只要要用到就要聲明打包
     "./app.js",      "./agent.js"
   ],    "assets": [ // 這里是聲明需要打包的靜態(tài)文件(即使有js文件也不進(jìn)行編譯)。
     "./lib/**/*",// lib中是我打算開(kāi)放的一些egg組件,所有不需要編譯
     "./app/public/**/*",// 如果要把前端靜態(tài)文件打包進(jìn)來(lái),就直接聲明(但是在egg中static中間件會(huì)有拋錯(cuò),需要hack egg或者 hack pkg)
     "./node_modules/**/*"http:// npm安裝的所有依賴包全部打包進(jìn)來(lái),不要依賴自動(dòng)引入,很容易導(dǎo)致部分文件沒(méi)打包,出現(xiàn)各種意料外的錯(cuò)誤
   ]
 },
}
3、增加入口文件pkg-entry.js(名字保持和package.json中一致)
const fs = require('fs');// 如果是egg的ts項(xiàng)目,由于egg-script會(huì)給ts項(xiàng)目通過(guò)-r引入sourcemap的注入文件,但是pkg的spawn不支持,所以把項(xiàng)目標(biāo)識(shí)為飛ts// 如果不是ts項(xiàng)目忽略一下兩行const pkgInfo = require('./package');
pkgInfo.egg.typescript = false; // 防止egg-script識(shí)別為 typescript 自動(dòng)添加soucemap支持(--require 在pkg的spawn中不支持)//我自己的工具包的配置文件是直接打包到安裝包里面的,這樣就不方便修改配置了。于是把提供給運(yùn)維配置的配置都適用dotenv來(lái)配置,以下引入dotenv的預(yù)執(zhí)行腳本//也可以考慮把配置文件放到包外,不過(guò)因?yàn)榘鼉?nèi)執(zhí)行包外js,會(huì)增加被攻擊的風(fēng)險(xiǎn)require('dotenv/config');// 由于egg-script是默認(rèn)以當(dāng)前執(zhí)行proccess.cwd() 路徑為默認(rèn)項(xiàng)目的,打包后需要每次輸入 /snapshot/${項(xiàng)目文件夾名} 作為指定目錄// 所以,以下為修改參數(shù),自動(dòng)嵌入“/snapshot/${項(xiàng)目文件夾名}”const baseDir = '/snapshot/' + fs.readdirSync('/snapshot')[0];console.log('baseDir:', baseDir);// 當(dāng) start 的時(shí)候,自動(dòng)嵌入bashDir為 /snapshot/${項(xiàng)目文件夾名}const startIndex = process.argv.indexOf('start');if (startIndex > -1) {
   process.argv = [].concat(
       process.argv.slice(0, startIndex + 1),
       baseDir,
       process.argv.slice(startIndex + 1),
   );
}// 然后直接調(diào)起egg-scripts執(zhí)行require('./node_modules/egg-scripts/bin/egg-scripts.js');
正如前面所說(shuō),用pkg打包,可能會(huì)有這些修改過(guò)程,所以說(shuō)如果是單純的防代碼泄露是可以用JShaman來(lái)完成的。
4、 執(zhí)行打包
## --targets 用于制定平臺(tái)和node版本,不指定時(shí)默認(rèn)為3個(gè)平臺(tái)以package.json中的node版本配置為準(zhǔn)## --out-path 指定執(zhí)行包輸出文件夾,默認(rèn)為當(dāng)前文件夾## --debug 用于調(diào)試,可了解哪些文件被打包pkg .  --targets node8-linux-x64 --out-path /usr/dist  --debug
5、運(yùn)行
> chmod a+x ./appName #給可執(zhí)行包增加執(zhí)行權(quán)限> ./appName start   # 啟動(dòng)項(xiàng)目,除項(xiàng)目路徑其它參數(shù)都和egg-scripts一致 可以用--title指定egg服務(wù)名>./appName stop # 關(guān)閉項(xiàng)目(會(huì)關(guān)閉當(dāng)前服務(wù)器的所有egg服務(wù),如果有多個(gè),最好用--title來(lái)指定要關(guān)閉的項(xiàng)目)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
vue[0x01] -- Hello World
Grunt 新手一日入門 | 于江水
 Grunt Getting started 
grunt 初了解
Python包管理工具setuptools詳解
webpack學(xué)習(xí)(一)安裝和基本環(huán)境搭建、一次js打包體驗(yàn)及不同版本錯(cuò)誤
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服