xhs-mp-compiler-cli 1.3.4 → 1.4.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/compiler.d.ts +15 -11
  2. package/dist/compiler.js +96 -40
  3. package/dist/compilerImpl.d.ts +1 -0
  4. package/dist/{compilerCP.js → compilerImpl.js} +29 -42
  5. package/dist/compilerImplChildProcess.js +33 -0
  6. package/dist/compilerImplThreadWorker.d.ts +1 -0
  7. package/dist/compilerImplThreadWorker.js +30 -0
  8. package/dist/compilerImplWebWorker.d.ts +6 -0
  9. package/dist/compilerImplWebWorker.js +25 -0
  10. package/dist/dev-server/compatibleAPI.d.ts +25 -0
  11. package/dist/dev-server/compatibleAPI.js +56 -0
  12. package/dist/dev-server/escapeHtml.d.ts +5 -0
  13. package/dist/dev-server/escapeHtml.js +50 -0
  14. package/dist/dev-server/etag.d.ts +10 -0
  15. package/dist/dev-server/etag.js +69 -0
  16. package/dist/dev-server/getFilenameFromUrl.d.ts +9 -0
  17. package/dist/dev-server/getFilenameFromUrl.js +102 -0
  18. package/dist/dev-server/getPaths.d.ts +6 -0
  19. package/dist/dev-server/getPaths.js +20 -0
  20. package/dist/dev-server/index.d.ts +98 -0
  21. package/dist/dev-server/index.js +90 -0
  22. package/dist/dev-server/memorize.d.ts +7 -0
  23. package/dist/dev-server/memorize.js +23 -0
  24. package/dist/dev-server/middleware.d.ts +2 -0
  25. package/dist/dev-server/middleware.js +477 -0
  26. package/dist/dev-server/ready.d.ts +4 -0
  27. package/dist/dev-server/ready.js +11 -0
  28. package/dist/index.d.ts +3 -3
  29. package/dist/index.js +5 -5
  30. package/dist/packs/mp-pack/index.js +0 -1
  31. package/dist/packs/webpack/dev-server/index.js +1 -0
  32. package/dist/packs/webpack/index.d.ts +1 -1
  33. package/dist/packs/webpack/index.js +3 -4
  34. package/dist/packs/webpack/webpack.d.ts +1 -1
  35. package/dist/packs/webpack/webpack.js +6 -2
  36. package/dist/presets/configs/miniprogram/render/index.d.ts +2 -3
  37. package/dist/presets/configs/miniprogram/render/index.js +2 -2
  38. package/dist/presets/configs/miniprogram/service/index.js +1 -0
  39. package/dist/sharedFs.d.ts +2 -0
  40. package/dist/sharedFs.js +4 -0
  41. package/dist/utils/workerPool.d.ts +29 -0
  42. package/dist/utils/workerPool.js +115 -0
  43. package/package.json +26 -12
  44. /package/dist/{compilerCP.d.ts → compilerImplChildProcess.d.ts} +0 -0
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sharedFs = require('xhs-mp-shared-fs');
4
+ exports.default = sharedFs;
@@ -0,0 +1,29 @@
1
+ declare class WorkerPool {
2
+ workerPath: string;
3
+ numberOfThreads: number;
4
+ _queue: any[];
5
+ _workersById: {
6
+ [key: string]: any;
7
+ };
8
+ _activeWorkersById: {
9
+ [key: string]: any;
10
+ };
11
+ constructor(workerPath: any, options?: {}, numberOfThreads?: any);
12
+ /**
13
+ * 检查空闲的 Worker
14
+ */
15
+ getInactiveWorkerId(): number;
16
+ /**
17
+ * 调用 Worker 执行,目的是在指定的 Worker 里执行指定的任务
18
+ */
19
+ runWorker(workerId: any, taskObj: any): void;
20
+ /**
21
+ * 运行线程
22
+ */
23
+ run(data: any): Promise<unknown>;
24
+ /**
25
+ * 销毁
26
+ */
27
+ destroy(force?: boolean): void;
28
+ }
29
+ export default WorkerPool;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // 获取当前设备的 CPU 线程数目,作为 numberOfThreads 的默认值。
4
+ const { length: cpusLength } = require('os').cpus();
5
+ const { Worker } = require('worker_threads');
6
+ class WorkerPool {
7
+ constructor(workerPath, options = {}, numberOfThreads = cpusLength) {
8
+ this._workersById = {};
9
+ this._activeWorkersById = {};
10
+ if (numberOfThreads < 1) {
11
+ throw new Error('Number of threads should be greater or equal than 1!');
12
+ }
13
+ this.workerPath = workerPath;
14
+ this.numberOfThreads = numberOfThreads;
15
+ // 任务队列
16
+ this._queue = [];
17
+ // Worker 索引
18
+ this._workersById = {};
19
+ // Worker 激活状态索引
20
+ this._activeWorkersById = {};
21
+ // 创建 Workers
22
+ for (let i = 0; i < this.numberOfThreads; i++) {
23
+ const worker = new Worker(workerPath, options);
24
+ this._workersById[i] = worker;
25
+ // 将这些 Worker 设置为未激活状态
26
+ this._activeWorkersById[i] = false;
27
+ }
28
+ }
29
+ /**
30
+ * 检查空闲的 Worker
31
+ */
32
+ getInactiveWorkerId() {
33
+ for (let i = 0; i < this.numberOfThreads; i++) {
34
+ if (!this._activeWorkersById[i])
35
+ return i;
36
+ }
37
+ return -1;
38
+ }
39
+ /**
40
+ * 调用 Worker 执行,目的是在指定的 Worker 里执行指定的任务
41
+ */
42
+ runWorker(workerId, taskObj) {
43
+ const worker = this._workersById[workerId];
44
+ // 当任务执行完毕后执行
45
+ const doAfterTaskIsFinished = () => {
46
+ // 去除所有的 Listener,不然一次次添加不同的 Listener 会内存溢出(OOM)
47
+ worker.removeAllListeners('message');
48
+ worker.removeAllListeners('error');
49
+ // 将这个 Worker 设为未激活状态
50
+ this._activeWorkersById[workerId] = false;
51
+ if (this._queue.length) {
52
+ // 任务队列非空,使用该 Worker 执行任务队列中第一个任务
53
+ this.runWorker(workerId, this._queue.shift());
54
+ }
55
+ };
56
+ // 将这个 Worker 设置为激活状态
57
+ this._activeWorkersById[workerId] = true;
58
+ // 设置两个回调,用于 Worker 的监听器
59
+ const messageCallback = result => {
60
+ taskObj.cb(null, result);
61
+ doAfterTaskIsFinished();
62
+ };
63
+ const errorCallback = error => {
64
+ taskObj.cb(error);
65
+ doAfterTaskIsFinished();
66
+ };
67
+ // 为 Worker 添加 'message' 和 'error' 两个 Listener
68
+ worker.once('message', messageCallback);
69
+ worker.once('error', errorCallback);
70
+ // 将数据传给 Worker 供其获取和执行
71
+ worker.postMessage(taskObj.data);
72
+ }
73
+ /**
74
+ * 运行线程
75
+ */
76
+ run(data) {
77
+ // Promise 是个好东西
78
+ return new Promise((resolve, reject) => {
79
+ // 调用 getInactiveWorkerId() 获取一个空闲的 Worker
80
+ const availableWorkerId = this.getInactiveWorkerId();
81
+ const taskObj = {
82
+ data,
83
+ cb: (error, result) => {
84
+ // 虽然 Workers 需要使用 Listener 和 Callback,但这不能阻止我们使用 Promise,对吧?
85
+ // 不,你不能 util.promisify(taskObj) 。人不能,至少不应该。
86
+ if (error)
87
+ reject(error);
88
+ return resolve(result);
89
+ }
90
+ };
91
+ if (availableWorkerId === -1) {
92
+ // 当前没有空闲的 Workers 了,把任务丢进队列里,这样一旦有 Workers 空闲时就会开始执行。
93
+ this._queue.push(taskObj);
94
+ return null;
95
+ }
96
+ // 有一个空闲的 Worker,用它执行任务
97
+ this.runWorker(availableWorkerId, taskObj);
98
+ });
99
+ }
100
+ /**
101
+ * 销毁
102
+ */
103
+ destroy(force = false) {
104
+ for (let i = 0; i < this.numberOfThreads; i++) {
105
+ if (this._activeWorkersById[i] && !force) {
106
+ // 通常情况下,不应该在还有 Worker 在执行的时候就销毁它,这一定是什么地方出了问题,所以还是抛个 Error 比较好
107
+ // 不过保留一个 force 参数,总有人用得到的
108
+ throw new Error(`The worker ${i} is still runing!`);
109
+ }
110
+ // 销毁这个 Worker
111
+ this._workersById[i].terminate();
112
+ }
113
+ }
114
+ }
115
+ exports.default = WorkerPool;
package/package.json CHANGED
@@ -1,11 +1,24 @@
1
1
  {
2
2
  "name": "xhs-mp-compiler-cli",
3
- "version": "1.3.4",
3
+ "version": "1.4.0-beta.0",
4
4
  "description": "xhs mp command tool.",
5
5
  "preferGlobal": true,
6
6
  "category": "esm",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "require": "./dist/index.js",
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./sharedFs": {
16
+ "require": "./dist/sharedFs.js",
17
+ "import": "./dist/sharedFs.js",
18
+ "types": "./dist/sharedFs.d.ts"
19
+ },
20
+ "./*.map": "./dist/*.map"
21
+ },
9
22
  "publishConfig": {
10
23
  "registry": "https://registry.npmjs.org/",
11
24
  "access": "public"
@@ -20,11 +33,6 @@
20
33
  "author": "zyu1 <fuzhu@xiaohongshu.com>",
21
34
  "license": "MIT",
22
35
  "dependencies": {
23
- "archiver": "^7.0.1",
24
- "debug": "^4.3.4",
25
- "globby": "^11.1.0",
26
- "query-string": "^8.1.0",
27
- "yauzl": "^2.10.0",
28
36
  "@babel/core": "^7.12.10",
29
37
  "@babel/generator": "^7.12.10",
30
38
  "@babel/parser": "^7.12.10",
@@ -38,11 +46,11 @@
38
46
  "@swc/core": "^1.3.74",
39
47
  "@swc/helpers": "^0.5.1",
40
48
  "@vue/babel-preset-jsx": "^1.2.4",
49
+ "archiver": "^7.0.1",
41
50
  "babel-loader": "^8.2.2",
42
51
  "babel-plugin-istanbul": "^6.0.0",
43
52
  "babel-preset-minify": "^0.4.3",
44
53
  "clean-webpack-plugin": "^3.0.0",
45
- "uuid": "^9.0.1",
46
54
  "clone": "^2.1.2",
47
55
  "commander": "^8.0.0",
48
56
  "copy-webpack-plugin": "^9.0.1",
@@ -50,11 +58,13 @@
50
58
  "css-loader": "^5.0.2",
51
59
  "css-minimizer-webpack-plugin": "^1.2.0",
52
60
  "cssnano": "4.1.10",
61
+ "debug": "^4.3.4",
53
62
  "enhanced-resolve": "^5.8.3",
54
63
  "fork-ts-checker-webpack-plugin": "^6.1.0",
55
64
  "friendly-errors-webpack-plugin": "^1.7.0",
56
65
  "fs-extra": "^10.0.0",
57
66
  "glob": "^8.0.1",
67
+ "globby": "^11.1.0",
58
68
  "htmlparser2": "^7.1.2",
59
69
  "lodash": "^4.17.21",
60
70
  "mini-css-extract-plugin": "^1.6.2",
@@ -67,6 +77,7 @@
67
77
  "postcss-prefix-selector": "^1.10.0",
68
78
  "postcss-preset-env": "^6.7.0",
69
79
  "postcss-pxtorem": "^5.1.1",
80
+ "query-string": "^8.1.0",
70
81
  "querystring": "^0.2.1",
71
82
  "source-map": "^0.6.1",
72
83
  "speed-measure-webpack-plugin": "^1.5.0",
@@ -75,6 +86,7 @@
75
86
  "tapable": "^2.2.1",
76
87
  "terser-webpack-plugin": "^5.2.4",
77
88
  "typescript": "^5.1.6",
89
+ "uuid": "^9.0.1",
78
90
  "vue": "^3.2.26",
79
91
  "vue-loader": "^16.4.1",
80
92
  "vue-style-loader": "^4.1.2",
@@ -82,11 +94,13 @@
82
94
  "webpack-bundle-analyzer": "^4.4.0",
83
95
  "webpack-chain": "^6.5.1",
84
96
  "webpack-sources": "^3.2.2",
85
- "xhs-mp-compiler-ml-loader": "1.3.4",
86
- "xhs-mp-compiler-utils": "1.2.4",
87
- "xhs-mp-pack": "^1.2.4",
88
- "xhs-mp-project": "^1.2.4",
89
- "xhs-mp-utils": "^1.3.4"
97
+ "xhs-mp-compiler-ml-loader": "1.4.0-beta.0",
98
+ "xhs-mp-compiler-utils": "1.3.0-beta.0",
99
+ "xhs-mp-pack": "^1.3.0-beta.0",
100
+ "xhs-mp-project": "^1.3.0-beta.0",
101
+ "xhs-mp-utils": "^1.4.0-beta.0",
102
+ "xhs-mp-shared-fs": "^1.1.0-beta.0",
103
+ "yauzl": "^2.10.0"
90
104
  },
91
105
  "devDependencies": {
92
106
  "@types/babel__generator": "7.6.3",