瀏覽代碼

Добавлена упаковка web-приложения внутрь исполнимого файла

Book Pauk 2 年之前
父節點
當前提交
03e89502d5
共有 7 個文件被更改,包括 78 次插入34 次删除
  1. 0 15
      build/linux.js
  2. 43 0
      build/prepkg.js
  3. 0 15
      build/win.js
  4. 4 3
      package.json
  5. 4 1
      server/core/WebWorker.js
  6. 23 0
      server/createWebApp.js
  7. 4 0
      server/index.js

+ 0 - 15
build/linux.js

@@ -1,15 +0,0 @@
-const fs = require('fs-extra');
-const path = require('path');
-
-const distDir = path.resolve(__dirname, '../dist');
-const publicDir = `${distDir}/tmp/public`;
-const outDir = `${distDir}/linux`;
-
-async function main() {
-    await fs.emptyDir(outDir);
-    // перемещаем public на место
-    if (await fs.pathExists(publicDir))
-        await fs.move(publicDir, `${outDir}/public`);
-}
-
-main();

+ 43 - 0
build/prepkg.js

@@ -0,0 +1,43 @@
+const fs = require('fs-extra');
+const path = require('path');
+const { execSync } = require('child_process');
+
+const platform = process.argv[2];
+
+const distDir = path.resolve(__dirname, '../dist');
+const tmpDir = `${distDir}/tmp`;
+const publicDir = `${tmpDir}/public`;
+const outDir = `${distDir}/${platform}`;
+
+async function build() {
+    if (platform != 'linux' && platform != 'win')
+        throw new Error(`Unknown platform: ${platform}`);
+
+    await fs.emptyDir(outDir);
+
+    // перемещаем public на место
+    if (await fs.pathExists(publicDir)) {
+
+        const zipFile = `${tmpDir}/public.zip`;
+        const jsonFile = `${distDir}/public.json`;//distDir !!!
+
+        await fs.remove(zipFile);
+        execSync(`zip -r ${zipFile} .`, {cwd: publicDir, stdio: 'inherit'});
+
+        const data = (await fs.readFile(zipFile)).toString('base64');
+        await fs.writeFile(jsonFile, JSON.stringify({data}));
+    } else {
+        throw new Error(`publicDir: ${publicDir} does not exist`);
+    }
+}
+
+async function main() {
+    try {
+        await build();
+    } catch(e) {
+        console.error(e);
+        process.exit(1);
+    }
+}
+
+main();

+ 0 - 15
build/win.js

@@ -1,15 +0,0 @@
-const fs = require('fs-extra');
-const path = require('path');
-
-const distDir = path.resolve(__dirname, '../dist');
-const publicDir = `${distDir}/tmp/public`;
-const outDir = `${distDir}/win`;
-
-async function main() {
-    await fs.emptyDir(outDir);
-    // перемещаем public на место
-    if (await fs.pathExists(publicDir))
-        await fs.move(publicDir, `${outDir}/public`);
-}
-
-main();

+ 4 - 3
package.json

@@ -10,14 +10,15 @@
   "scripts": {
     "dev": "nodemon --inspect --ignore server/.inpx-web --ignore client --exec 'node --expose-gc server --lib-dir=server/.inpx-web/lib'",
     "build:client": "webpack --config build/webpack.prod.config.js",
-    "build:linux": "npm run build:client && node build/linux && pkg -t node16-linux-x64 -C GZip --options max-old-space-size=4096,expose-gc -o dist/linux/inpx-web .",
-    "build:win": "npm run build:client && node build/win && pkg -t node16-win-x64 -C GZip --options max-old-space-size=4096,expose-gc -o dist/win/inpx-web .",
+    "build:linux": "npm run build:client && node build/prepkg.js linux && pkg -t node16-linux-x64 -C GZip --options max-old-space-size=4096,expose-gc -o dist/linux/inpx-web .",
+    "build:win": "npm run build:client && node build/prepkg.js win && pkg -t node16-win-x64 -C GZip --options max-old-space-size=4096,expose-gc -o dist/win/inpx-web .",
     "build:client-dev": "webpack --config build/webpack.dev.config.js",
     "postinstall": "npm run build:client-dev"
   },
   "bin": "server/index.js",
   "pkg": {
-    "scripts": "server/config/*.js"
+    "scripts": "server/config/*.js",
+    "assets": "dist/public.json"
   },
   "devDependencies": {
     "@babel/core": "^7.18.9",

+ 4 - 1
server/core/WebWorker.js

@@ -464,11 +464,14 @@ class WebWorker {
 
     async periodicCleanDir(dirConfig) {
         try {
+            for (const config of dirConfig) 
+                await fs.ensureDir(config.dir);
+
             let lastCleanDirTime = 0;
             while (1) {// eslint-disable-line no-constant-condition
                 //чистка папок
                 if (Date.now() - lastCleanDirTime >= cleanDirPeriod) {
-                    for (const config of Object.values(dirConfig)) {
+                    for (const config of dirConfig) {
                         try {
                             await this.cleanDir(config);
                         } catch(e) {

+ 23 - 0
server/createWebApp.js

@@ -0,0 +1,23 @@
+const fs = require('fs-extra');
+
+const webApp = require('../dist/public.json');
+const ZipReader = require('./core/ZipReader');
+
+module.exports = async(config) => {
+    const zipFile = `${config.tempDir}/public.zip`;
+
+    await fs.writeFile(zipFile, webApp.data, {encoding: 'base64'});
+
+    const zipReader = new ZipReader();
+    await zipReader.open(zipFile);
+
+    await fs.remove(config.publicDir);
+
+    try {
+        await zipReader.extractAllToDir(config.publicDir);
+    } finally {
+        await zipReader.close();
+    }
+
+    await fs.remove(zipFile);
+};

+ 4 - 0
server/index.js

@@ -52,6 +52,10 @@ async function init() {
     await fs.ensureDir(config.tempDir);
     await fs.emptyDir(config.tempDir);
 
+    //web app
+    const createWebApp = require('./createWebApp');
+    await createWebApp(config);
+
     //cli
     if (argv.help) {
         showHelp();