egg 打包


目標

打包 egg 項目為單一的可執行文件,支持跨平台,擺脫環境依賴。

准備

npm install -g pkg

初始化項目

1.0.0-使用腳手架初始化 eggjs 項目

npm init egg --type=ts

1.0.1-安裝依賴

npm i

1.0.2-測試運行

npm run dev

1.0.3 創建測試用靜態文件並配置 egg-etag

npm install egg-etag

plugin.ts中增加配置啟用egg-etag

etag: {
  package: 'egg-etag',
},

增加 pkg 相關配置 1.0.4

在項目根目錄創建pkg-entry.js

"use strict";
const fs = require("fs");

// 如果是egg的ts項目,由於egg-script會給ts項目通過-r引入sourcemap的注入文件,但是pkg的spawn不支持,所以把項目標識為飛ts
// 如果不是ts項目忽略一下兩行
const pkgInfo = require("./package");
pkgInfo.egg.typescript = false; // 防止egg-script識別為 typescript 自動添加soucemap支持(--require 在pkg的spawn中不支持)

// 由於egg-script是默認以當前執行proccess.cwd() 路徑為默認項目的,打包后需要每次輸入 /snapshot/${項目文件夾名} 作為指定目錄
// 所以,以下為修改參數,自動嵌入“/snapshot/${項目文件夾名}”
const baseDir = "/snapshot/" + fs.readdirSync("/snapshot")[0];
// 當 start 的時候,自動嵌入bashDir為 /snapshot/${項目文件夾名}
// 如果要傳入自定義啟動參數也可以在這里處理,如指定是否后台運行,指定端口號等
const startIndex = process.argv.indexOf("start");
if (startIndex > -1) {
  process.argv = [].concat(
    process.argv.slice(0, startIndex + 1),
    baseDir,
    process.argv.slice(startIndex + 1)
  );
}

// 然后直接調起egg-scripts執行
require("./node_modules/egg-scripts/bin/egg-scripts.js");

.eslintignore中增加忽略pkg-entry.js

package.json中增加以下內容

"bin": "pkg-entry.js",
"pkg": {
  "scripts": [
    "./app/**/*.js",
    "./config/**/*.js"
  ],
  "assets": [
    "./app/public/**/*",
    "./node_modules/nanoid/**/*.js"
  ]
},

在項目根目錄創建編譯腳本build.sh

set -e
# 編譯ts為js
npm run tsc
# 編譯生成二進制文件
pkg .  --out-path ./dist
# 清理臨時js文件
npm run clean

dist/目錄加入.gitgnore

config.prod.ts中的可選配置

// 配置運行時相關文件存儲路徑
config.rundir = process.cwd() + "/run";

// 配置日志目錄
config.logger = {
  dir: process.cwd() + "/logs",
};

// 配置靜態資源路徑
config.static = {
  prefix: "/public",
  dir: process.cwd() + "/public",
};

填坑

.gitignore中增加 !pkg-entry.js

重點

轉自:http://lidong.xin/egg/eggts-pkg.html#%E7%9B%AE%E6%A0%87


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM