@ynight/cli 0.0.0-stage → 0.0.1
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.
- package/LICENSE +21 -0
- package/README.md +251 -2
- package/config/client.json +14 -0
- package/config/server.json +16 -0
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +114 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands.d.ts +38 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +225 -0
- package/dist/commands.js.map +1 -0
- package/dist/dev-entry.d.ts +2 -0
- package/dist/dev-entry.d.ts.map +1 -0
- package/dist/dev-entry.js +348 -0
- package/dist/dev-entry.js.map +1 -0
- package/dist/dev-proxy.d.ts +21 -0
- package/dist/dev-proxy.d.ts.map +1 -0
- package/dist/dev-proxy.js +98 -0
- package/dist/dev-proxy.js.map +1 -0
- package/dist/dev-watcher.d.ts +24 -0
- package/dist/dev-watcher.d.ts.map +1 -0
- package/dist/dev-watcher.js +242 -0
- package/dist/dev-watcher.js.map +1 -0
- package/dist/generate-types.d.ts +14 -0
- package/dist/generate-types.d.ts.map +1 -0
- package/dist/generate-types.js +190 -0
- package/dist/generate-types.js.map +1 -0
- package/dist/output-safety.d.ts +47 -0
- package/dist/output-safety.d.ts.map +1 -0
- package/dist/output-safety.js +145 -0
- package/dist/output-safety.js.map +1 -0
- package/dist/project-config.d.ts +72 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +221 -0
- package/dist/project-config.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +84 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +176 -0
- package/dist/utils.js.map +1 -0
- package/dist/webpack-build.d.ts +87 -0
- package/dist/webpack-build.d.ts.map +1 -0
- package/dist/webpack-build.js +475 -0
- package/dist/webpack-build.js.map +1 -0
- package/package.json +64 -3
- package/tsconfig/client.json +3 -0
- package/tsconfig/server.json +3 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createWebpackConfig = createWebpackConfig;
|
|
4
|
+
exports.buildFrontend = buildFrontend;
|
|
5
|
+
exports.startDevFrontend = startDevFrontend;
|
|
6
|
+
exports.pageOutputPaths = pageOutputPaths;
|
|
7
|
+
exports.createFrontendOptions = createFrontendOptions;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
9
|
+
const node_fs_1 = tslib_1.__importDefault(require("node:fs"));
|
|
10
|
+
const node_path_1 = tslib_1.__importDefault(require("node:path"));
|
|
11
|
+
const webpack_1 = tslib_1.__importDefault(require("webpack"));
|
|
12
|
+
const html_webpack_plugin_1 = tslib_1.__importDefault(require("html-webpack-plugin"));
|
|
13
|
+
const mini_css_extract_plugin_1 = tslib_1.__importDefault(require("mini-css-extract-plugin"));
|
|
14
|
+
const esbuild_loader_1 = require("esbuild-loader");
|
|
15
|
+
const vue_loader_1 = require("vue-loader");
|
|
16
|
+
const webpack_dev_middleware_1 = tslib_1.__importDefault(require("webpack-dev-middleware"));
|
|
17
|
+
const webpack_hot_middleware_1 = tslib_1.__importDefault(require("webpack-hot-middleware"));
|
|
18
|
+
const express_1 = tslib_1.__importDefault(require("express"));
|
|
19
|
+
const project_config_1 = require("./project-config");
|
|
20
|
+
/**
|
|
21
|
+
* Elpis 框架预置的三个页面入口。
|
|
22
|
+
*
|
|
23
|
+
* 注意:新业务如果需要新增页面,需要同步修改:
|
|
24
|
+
* - 命令文件的 build 流程里对 `manifest.pages` 的写入;
|
|
25
|
+
* - 框架客户端侧的路由表(通常在 `@ynight/framework/client` 中维护)。
|
|
26
|
+
*/
|
|
27
|
+
const PAGE_NAMES = ['project-list', 'dashboard', 'error'];
|
|
28
|
+
/**
|
|
29
|
+
* 将字符串中的 HTML 特殊字符转义,避免用户配置的标题破坏 HTML 结构。
|
|
30
|
+
*/
|
|
31
|
+
function escapeHtml(value) {
|
|
32
|
+
return value.replace(/[&<>"']/g, character => {
|
|
33
|
+
const entities = {
|
|
34
|
+
'&': '&',
|
|
35
|
+
'<': '<',
|
|
36
|
+
'>': '>',
|
|
37
|
+
'"': '"',
|
|
38
|
+
"'": ''',
|
|
39
|
+
};
|
|
40
|
+
return entities[character] ?? character;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 生成每个页面的"虚拟入口"内容。
|
|
45
|
+
*
|
|
46
|
+
* 通过 `virtual:` 前缀配合 `webpack.experiments.schemes.VirtualUrlPlugin`,
|
|
47
|
+
* 把这些字符串注册为虚拟模块,避开临时文件 / 多 entry 维护成本。
|
|
48
|
+
*
|
|
49
|
+
* 注入内容:
|
|
50
|
+
* - 调用 `createAdminApp` 渲染 SPA;
|
|
51
|
+
* - 注入项目自定义 `extensions`(如果有);
|
|
52
|
+
* - 透传 `publicConfig`(标题、首页、项目模式、dashboard base 等)。
|
|
53
|
+
*/
|
|
54
|
+
function generatedEntry(page, options, extensionsPath) {
|
|
55
|
+
const extensionImport = extensionsPath
|
|
56
|
+
? `import extensionModule from ${JSON.stringify(extensionsPath)};\nconst extensions = extensionModule?.default ?? extensionModule;`
|
|
57
|
+
: 'const extensions = {};';
|
|
58
|
+
// dashboard 走独立的 base 配置,便于挂载到子路径;其它页面使用 `/page` 形式。
|
|
59
|
+
const base = page === 'dashboard' ? (options.dashboardBase ?? '/dashboard') : `/${page}`;
|
|
60
|
+
const publicConfig = {
|
|
61
|
+
title: options.publicTitle ?? 'Elpis 管理后台',
|
|
62
|
+
homePage: options.config.public?.homePage ?? '/project-list',
|
|
63
|
+
projectListMode: options.config.public?.projectListMode,
|
|
64
|
+
defaultProjectKey: options.config.public?.defaultProjectKey,
|
|
65
|
+
dashboardBase: options.dashboardBase ?? '/dashboard',
|
|
66
|
+
};
|
|
67
|
+
return [
|
|
68
|
+
"import { createAdminApp } from '@ynight/framework/client';",
|
|
69
|
+
"import '@ynight/framework/style.css';",
|
|
70
|
+
extensionImport,
|
|
71
|
+
`createAdminApp({ page: ${JSON.stringify(page)}, mount: '#root', base: ${JSON.stringify(base)}, extensions, config: ${JSON.stringify(publicConfig)} });`,
|
|
72
|
+
'',
|
|
73
|
+
].join('\n');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 在 CLI 包自身 node_modules 中解析依赖路径,避免被业务工程的 node_modules 覆盖。
|
|
77
|
+
*
|
|
78
|
+
* 用于 vue-loader、css-loader 等核心 loader。
|
|
79
|
+
*/
|
|
80
|
+
function packageEntry(name) {
|
|
81
|
+
return require.resolve(name, { paths: [__dirname] });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 基于前端选项构造 webpack 配置。
|
|
85
|
+
*
|
|
86
|
+
* 主要决策:
|
|
87
|
+
* - 使用 `virtual:` 模块让每个页面有独立 entry 与 HtmlWebpackPlugin 实例;
|
|
88
|
+
* - 开发模式下启用 HMR + `webpack-hot-middleware`,并把 HMR 路径固定为
|
|
89
|
+
* `/__webpack_hmr`(与 `dev-proxy.ts` 的代理策略对齐);
|
|
90
|
+
* - 生产模式使用 `MiniCssExtractPlugin` 抽离 CSS 并配合内容 hash;
|
|
91
|
+
* - 用 `esbuild-loader` 替代 babel,速度更快;
|
|
92
|
+
* - 通过 `VueLoaderPlugin` + `DefinePlugin` 关闭 Vue 生产环境的开发工具,减小体积。
|
|
93
|
+
*
|
|
94
|
+
* @param options 来自 `createFrontendOptions` 的统一配置。
|
|
95
|
+
*/
|
|
96
|
+
function createWebpackConfig(options) {
|
|
97
|
+
const extensionsPath = (0, project_config_1.resolveClientExtensions)(options.root, options.config);
|
|
98
|
+
// 虚拟模块映射:key 是虚拟路径,value 是入口文件源码字符串。
|
|
99
|
+
const virtualModules = {};
|
|
100
|
+
const entry = {};
|
|
101
|
+
const htmlPlugins = [];
|
|
102
|
+
const isDevelopment = options.mode === 'development';
|
|
103
|
+
// publicPath 设置为 '/':
|
|
104
|
+
// 输出文件名已经包含 `dist/dev` 或 `dist` 前缀,Koa 静态根与浏览器 URL 相同,
|
|
105
|
+
// 不需要再让 HtmlWebpackPlugin 二次拼接。
|
|
106
|
+
const publicPath = '/';
|
|
107
|
+
// 为每个页面构造虚拟入口 + HTML 模板插件。
|
|
108
|
+
for (const page of PAGE_NAMES) {
|
|
109
|
+
const virtualModule = `elpis/page-entry/${page}`;
|
|
110
|
+
virtualModules[virtualModule] = generatedEntry(page, options, extensionsPath);
|
|
111
|
+
entry[page] = isDevelopment
|
|
112
|
+
? // 开发模式先挂载 HMR 客户端(path 必须与 dev-proxy 的代理路径一致)。
|
|
113
|
+
[
|
|
114
|
+
`${packageEntry('webpack-hot-middleware/client')}?path=/__webpack_hmr&timeout=20000`,
|
|
115
|
+
`virtual:${virtualModule}`,
|
|
116
|
+
]
|
|
117
|
+
: `virtual:${virtualModule}`;
|
|
118
|
+
htmlPlugins.push(new html_webpack_plugin_1.default({
|
|
119
|
+
filename: `${page}.html`,
|
|
120
|
+
chunks: [page],
|
|
121
|
+
title: options.publicTitle ?? 'Elpis 管理后台',
|
|
122
|
+
// 直接内联模板,避免依赖外部 html 文件;title 已转义防注入。
|
|
123
|
+
templateContent: `<!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="data:,"><title>${escapeHtml(options.publicTitle ?? 'Elpis 管理后台')}</title></head><body><div id="root"></div></body></html>`,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
// CSS loader:开发用 style-loader(无刷新注入),生产用 MiniCssExtract。
|
|
127
|
+
const cssLoader = isDevelopment ? 'style-loader' : mini_css_extract_plugin_1.default.loader;
|
|
128
|
+
const config = {
|
|
129
|
+
mode: options.mode,
|
|
130
|
+
// 开发模式 eval-source-map:构建快、源码可定位;生产关闭以减小体积。
|
|
131
|
+
devtool: isDevelopment ? 'eval-source-map' : false,
|
|
132
|
+
context: options.root,
|
|
133
|
+
entry,
|
|
134
|
+
output: {
|
|
135
|
+
path: options.outputRoot,
|
|
136
|
+
publicPath,
|
|
137
|
+
// 生产文件名带 contenthash,方便 CDN 缓存;开发期不带 hash 便于调试。
|
|
138
|
+
filename: isDevelopment ? 'dist/dev/js/[name].js' : 'dist/js/[name].[contenthash:8].js',
|
|
139
|
+
chunkFilename: isDevelopment
|
|
140
|
+
? 'dist/dev/js/[name].chunk.js'
|
|
141
|
+
: 'dist/js/[name].[contenthash:8].chunk.js',
|
|
142
|
+
// HMR chunk 输出名必须固定,否则 hot-middleware 找不到对应文件。
|
|
143
|
+
hotUpdateChunkFilename: 'dist/dev/js/[id].[fullhash].hot-update.js',
|
|
144
|
+
hotUpdateMainFilename: 'dist/dev/js/[runtime].[fullhash].hot-update.json',
|
|
145
|
+
// CLI 自己负责清理(生产走 `replaceDirectoryAtomically`)。
|
|
146
|
+
clean: false,
|
|
147
|
+
},
|
|
148
|
+
module: {
|
|
149
|
+
rules: [
|
|
150
|
+
{
|
|
151
|
+
test: /\.vue$/,
|
|
152
|
+
use: { loader: packageEntry('vue-loader') },
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
test: /\.tsx?$/,
|
|
156
|
+
exclude: /node_modules/,
|
|
157
|
+
use: {
|
|
158
|
+
loader: packageEntry('esbuild-loader'),
|
|
159
|
+
// es2022 与现代 Node 完全对齐,省去大量 polyfill。
|
|
160
|
+
options: { loader: 'ts', target: 'es2022' },
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
test: /\.css$/,
|
|
165
|
+
use: [
|
|
166
|
+
cssLoader === 'style-loader' ? packageEntry('style-loader') : cssLoader,
|
|
167
|
+
packageEntry('css-loader'),
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
test: /\.less$/,
|
|
172
|
+
use: [
|
|
173
|
+
cssLoader === 'style-loader' ? packageEntry('style-loader') : cssLoader,
|
|
174
|
+
packageEntry('css-loader'),
|
|
175
|
+
packageEntry('less-loader'),
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
// 资源文件统一走 webpack5 的 asset module:小文件内联、大文件走文件。
|
|
180
|
+
test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf)$/i,
|
|
181
|
+
type: 'asset',
|
|
182
|
+
parser: { dataUrlCondition: { maxSize: 300 } },
|
|
183
|
+
generator: { filename: 'assets/[name].[contenthash:8][ext]' },
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
resolve: {
|
|
188
|
+
extensions: ['.ts', '.js', '.vue', '.json'],
|
|
189
|
+
// 解析顺序:业务工程 → CLI 包自身 → 全局,避免单边版本冲突。
|
|
190
|
+
modules: [
|
|
191
|
+
node_path_1.default.resolve(options.root, 'node_modules'),
|
|
192
|
+
node_path_1.default.resolve(__dirname, '../node_modules'),
|
|
193
|
+
'node_modules',
|
|
194
|
+
],
|
|
195
|
+
// 允许解析符号链接:pnpm / monorepo 等场景下 node_modules 经常是链接。
|
|
196
|
+
symlinks: true,
|
|
197
|
+
},
|
|
198
|
+
resolveLoader: {
|
|
199
|
+
modules: [
|
|
200
|
+
node_path_1.default.resolve(__dirname, '../node_modules'),
|
|
201
|
+
node_path_1.default.resolve(options.root, 'node_modules'),
|
|
202
|
+
'node_modules',
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
plugins: [
|
|
206
|
+
// 注册虚拟模块入口。
|
|
207
|
+
new webpack_1.default.experiments.schemes.VirtualUrlPlugin(virtualModules),
|
|
208
|
+
new vue_loader_1.VueLoaderPlugin(),
|
|
209
|
+
// 显式声明 Vue 编译期宏,避免不同 Vue 版本下默认行为差异。
|
|
210
|
+
new webpack_1.default.DefinePlugin({
|
|
211
|
+
__VUE_OPTIONS_API__: JSON.stringify(true),
|
|
212
|
+
__VUE_PROD_DEVTOOLS__: JSON.stringify(false),
|
|
213
|
+
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: JSON.stringify(false),
|
|
214
|
+
}),
|
|
215
|
+
// EsbuildPlugin 同时作为 minimizer(见 optimization)使用;这里只是同步常量。
|
|
216
|
+
new esbuild_loader_1.EsbuildPlugin({
|
|
217
|
+
define: {
|
|
218
|
+
__VUE_OPTIONS_API__: 'true',
|
|
219
|
+
__VUE_PROD_DEVTOOLS__: 'false',
|
|
220
|
+
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false',
|
|
221
|
+
},
|
|
222
|
+
}),
|
|
223
|
+
...htmlPlugins,
|
|
224
|
+
// HMR 仅开发模式需要;生产模式使用 MiniCssExtract 抽出独立 CSS。
|
|
225
|
+
...(isDevelopment
|
|
226
|
+
? [new webpack_1.default.HotModuleReplacementPlugin()]
|
|
227
|
+
: [new mini_css_extract_plugin_1.default({ filename: 'dist/css/[name].[contenthash:8].css' })]),
|
|
228
|
+
],
|
|
229
|
+
optimization: {
|
|
230
|
+
minimize: !isDevelopment,
|
|
231
|
+
// 把第三方依赖拆到独立 chunk,提升缓存命中率。
|
|
232
|
+
splitChunks: { chunks: 'all' },
|
|
233
|
+
// 生产模式用 esbuild 压缩 js + css,速度优于 terser。
|
|
234
|
+
...(isDevelopment ? {} : { minimizer: [new esbuild_loader_1.EsbuildPlugin({ target: 'es2022', css: true })] }),
|
|
235
|
+
},
|
|
236
|
+
// 抑制 webpack 噪音日志,仅保留 error。
|
|
237
|
+
infrastructureLogging: { level: 'error' },
|
|
238
|
+
};
|
|
239
|
+
return config;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* 把 webpack `Stats` 转为内部 `WebpackResult`,并在编译失败时抛错。
|
|
243
|
+
*/
|
|
244
|
+
function readStats(stats) {
|
|
245
|
+
const json = stats.toJson({ all: false, assets: true, errors: true, warnings: true });
|
|
246
|
+
const errors = json.errors ?? [];
|
|
247
|
+
if (errors.length > 0 || stats.hasErrors()) {
|
|
248
|
+
throw new Error(`前端 Webpack 编译失败:\n${errors
|
|
249
|
+
.map((error) => error.message ?? String(error))
|
|
250
|
+
.join('\n')}`);
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
// 仅保留 asset 名,方便上层做"页面 HTML 是否齐全"等校验。
|
|
254
|
+
assets: (json.assets ?? []).map((asset) => asset.name),
|
|
255
|
+
stats,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* 把 `compiler.run(callback)` 的回调封装为 Promise。
|
|
260
|
+
*
|
|
261
|
+
* 处理边界:
|
|
262
|
+
* - 已 settled 后再次收到回调,仅打印日志不再 resolve/reject;
|
|
263
|
+
* - `stats` 缺失视为 webpack 异常。
|
|
264
|
+
*/
|
|
265
|
+
function compile(compiler) {
|
|
266
|
+
return new Promise((resolve, reject) => {
|
|
267
|
+
let settled = false;
|
|
268
|
+
const callback = (error, stats) => {
|
|
269
|
+
if (error) {
|
|
270
|
+
if (!settled) {
|
|
271
|
+
settled = true;
|
|
272
|
+
reject(error);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.error(`前端 Webpack 编译失败: ${error.message}`);
|
|
276
|
+
}
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
if (!stats) {
|
|
280
|
+
const missing = new Error('Webpack 未返回编译结果');
|
|
281
|
+
if (!settled) {
|
|
282
|
+
settled = true;
|
|
283
|
+
reject(missing);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
console.error(missing.message);
|
|
287
|
+
}
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
try {
|
|
291
|
+
const result = readStats(stats);
|
|
292
|
+
if (!settled) {
|
|
293
|
+
settled = true;
|
|
294
|
+
resolve(result);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (compileError) {
|
|
298
|
+
if (!settled) {
|
|
299
|
+
settled = true;
|
|
300
|
+
reject(compileError);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
console.error(compileError instanceof Error ? compileError.message : compileError);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
compiler.run(callback);
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* 一次性构建:执行完成后关闭 compiler。
|
|
312
|
+
*
|
|
313
|
+
* @throws webpack 编译失败时抛出,便于上层捕获并回滚 staging 目录。
|
|
314
|
+
*/
|
|
315
|
+
async function buildFrontend(options) {
|
|
316
|
+
node_fs_1.default.mkdirSync(options.outputRoot, { recursive: true });
|
|
317
|
+
const compiler = (0, webpack_1.default)(createWebpackConfig(options));
|
|
318
|
+
try {
|
|
319
|
+
return await compile(compiler);
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
// 关闭 compiler 释放资源;错误不影响已返回的产物。
|
|
323
|
+
await new Promise(resolve => compiler.close(() => resolve()));
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* 启动开发模式的前端服务:webpack-dev-middleware + webpack-hot-middleware + express。
|
|
328
|
+
*
|
|
329
|
+
* 设计要点:
|
|
330
|
+
* - 监听 `127.0.0.1` 的 `webPort` 端口,仅本机可访问;
|
|
331
|
+
* - 只有在 webpack 首次构建完成且 express 监听成功后,promise 才会 resolve,
|
|
332
|
+
* 确保上层(dev-proxy)再开始把请求代理过来;
|
|
333
|
+
* - `close()` 顺序:先停 HMR SSE → server → middleware → compiler,
|
|
334
|
+
* 避免 hot-middleware 的长连接阻塞 server.close。
|
|
335
|
+
*/
|
|
336
|
+
function startDevFrontend(options) {
|
|
337
|
+
node_fs_1.default.mkdirSync(options.outputRoot, { recursive: true });
|
|
338
|
+
const compiler = (0, webpack_1.default)(createWebpackConfig(options));
|
|
339
|
+
const port = options.webPort ?? 8000;
|
|
340
|
+
const webApp = (0, express_1.default)();
|
|
341
|
+
// 允许跨域:开发模式下可能需要从其它端口(例如本地 mock)访问。
|
|
342
|
+
webApp.use((_request, response, next) => {
|
|
343
|
+
response.setHeader('Access-Control-Allow-Origin', '*');
|
|
344
|
+
next();
|
|
345
|
+
});
|
|
346
|
+
let webServer;
|
|
347
|
+
let middleware;
|
|
348
|
+
let hotMiddleware;
|
|
349
|
+
// closing:实现 close() 的幂等语义,避免重复关闭导致的异常。
|
|
350
|
+
let closing;
|
|
351
|
+
const result = new Promise((resolve, reject) => {
|
|
352
|
+
let ready = false;
|
|
353
|
+
let listening = false;
|
|
354
|
+
let initialResult;
|
|
355
|
+
// 仅当 listening 且首次编译完成时才 resolve,避免请求打到未就绪的服务。
|
|
356
|
+
const settleReady = () => {
|
|
357
|
+
if (listening && initialResult) {
|
|
358
|
+
ready = true;
|
|
359
|
+
resolve(initialResult);
|
|
360
|
+
}
|
|
361
|
+
};
|
|
362
|
+
const done = (stats) => {
|
|
363
|
+
try {
|
|
364
|
+
const next = readStats(stats);
|
|
365
|
+
initialResult = next;
|
|
366
|
+
settleReady();
|
|
367
|
+
}
|
|
368
|
+
catch (compileError) {
|
|
369
|
+
// ready 之前编译失败 → 拒绝初始 promise;之后仅打印日志。
|
|
370
|
+
if (ready) {
|
|
371
|
+
console.error(compileError instanceof Error ? compileError.message : compileError);
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
reject(compileError);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
compiler.hooks.done.tap('ElpisCliInitialBuild', done);
|
|
379
|
+
compiler.hooks.failed.tap('ElpisCliBuildFailure', error => {
|
|
380
|
+
if (ready) {
|
|
381
|
+
console.error(`前端 Webpack 编译失败: ${error.message}`);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
reject(error);
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
middleware = (0, webpack_dev_middleware_1.default)(compiler, {
|
|
388
|
+
// 与 output.publicPath 保持一致:产物写 `publicRoot/dist/dev/...`,
|
|
389
|
+
// Koa 静态根也是 publicRoot,因此浏览器 URL 应为 `/dist/dev/...`。
|
|
390
|
+
publicPath: '/',
|
|
391
|
+
stats: 'errors-warnings',
|
|
392
|
+
// 写盘便于 dev-proxy 在不读内存的情况下提供产物。
|
|
393
|
+
writeToDisk: true,
|
|
394
|
+
});
|
|
395
|
+
hotMiddleware = (0, webpack_hot_middleware_1.default)(compiler, { log: false });
|
|
396
|
+
webApp.use(middleware);
|
|
397
|
+
webApp.use(hotMiddleware);
|
|
398
|
+
// 仅监听回环:避免开发资源被外部访问。
|
|
399
|
+
const server = webApp.listen(port, '127.0.0.1');
|
|
400
|
+
webServer = server;
|
|
401
|
+
server.once('error', reject);
|
|
402
|
+
server.once('listening', () => {
|
|
403
|
+
listening = true;
|
|
404
|
+
settleReady();
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
return {
|
|
408
|
+
result,
|
|
409
|
+
close() {
|
|
410
|
+
if (closing) {
|
|
411
|
+
return closing;
|
|
412
|
+
}
|
|
413
|
+
closing = (async () => {
|
|
414
|
+
// 先终止 HMR SSE 长连接,否则 server.close 会一直等待浏览器断开。
|
|
415
|
+
hotMiddleware?.close();
|
|
416
|
+
await new Promise(resolve => {
|
|
417
|
+
if (!webServer) {
|
|
418
|
+
resolve();
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
// 兜底超时强制关闭所有活动连接,避免卡在 keep-alive。
|
|
422
|
+
const timeout = setTimeout(() => webServer?.closeAllConnections(), 2000);
|
|
423
|
+
timeout.unref();
|
|
424
|
+
webServer.close(() => {
|
|
425
|
+
clearTimeout(timeout);
|
|
426
|
+
resolve();
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
await new Promise(resolve => {
|
|
430
|
+
if (!middleware) {
|
|
431
|
+
resolve();
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
middleware.close(() => resolve());
|
|
435
|
+
});
|
|
436
|
+
await new Promise(resolve => compiler.close(() => resolve()));
|
|
437
|
+
})();
|
|
438
|
+
return closing;
|
|
439
|
+
},
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* 计算三个预置页面的 HTML 输出绝对路径列表,用于构建后做完整性校验。
|
|
444
|
+
*/
|
|
445
|
+
function pageOutputPaths(outputRoot) {
|
|
446
|
+
return PAGE_NAMES.map(page => node_path_1.default.resolve(outputRoot, `${page}.html`));
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* 把 `CliOptions` 与 Elpis 配置统一映射成 `FrontendOptions`,供 dev/build 共用。
|
|
450
|
+
*
|
|
451
|
+
* 关键规则:
|
|
452
|
+
* - `webPort` 优先取 CLI 参数,再回退到 `config.dev.webPort`;
|
|
453
|
+
* - 仅当配置项有显式值时才传入 `publicTitle` / `dashboardBase`,
|
|
454
|
+
* 避免被 `undefined` 覆盖 webpack 内部默认值。
|
|
455
|
+
*/
|
|
456
|
+
function createFrontendOptions(options, mode, outputRoot, config) {
|
|
457
|
+
const result = {
|
|
458
|
+
root: options.root,
|
|
459
|
+
outputRoot,
|
|
460
|
+
mode,
|
|
461
|
+
config,
|
|
462
|
+
};
|
|
463
|
+
const webPort = options.webPort ?? config.dev?.webPort;
|
|
464
|
+
if (webPort !== undefined) {
|
|
465
|
+
result.webPort = webPort;
|
|
466
|
+
}
|
|
467
|
+
if (config.public?.title !== undefined) {
|
|
468
|
+
result.publicTitle = config.public.title;
|
|
469
|
+
}
|
|
470
|
+
if (config.client?.dashboardBase !== undefined) {
|
|
471
|
+
result.dashboardBase = config.client.dashboardBase;
|
|
472
|
+
}
|
|
473
|
+
return result;
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=webpack-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webpack-build.js","sourceRoot":"","sources":["../src/webpack-build.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ynight/cli",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Elpis 业务工程的开发、构建与类型检查命令行工具",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+ssh://git@git.code.tencent.com/YNight/elpis.git"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"type": "commonjs",
|
|
11
|
+
"bin": {
|
|
12
|
+
"elpis": "./dist/bin.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"config",
|
|
17
|
+
"tsconfig",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"exports": {
|
|
22
|
+
"./tsconfig/server.json": "./config/server.json",
|
|
23
|
+
"./tsconfig/client.json": "./config/client.json"
|
|
24
|
+
},
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22.0.0"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"chokidar": "^4.0.3",
|
|
33
|
+
"css-loader": "^7.1.2",
|
|
34
|
+
"esbuild-loader": "^4.4.1",
|
|
35
|
+
"express": "5.2.1",
|
|
36
|
+
"html-webpack-plugin": "^5.6.5",
|
|
37
|
+
"less": "^4.5.1",
|
|
38
|
+
"less-loader": "^12.3.0",
|
|
39
|
+
"mini-css-extract-plugin": "^2.9.4",
|
|
40
|
+
"style-loader": "^4.0.0",
|
|
41
|
+
"ts-node": "^10.9.2",
|
|
42
|
+
"tslib": "^2.8.1",
|
|
43
|
+
"typescript": "^5.9.3",
|
|
44
|
+
"vue-loader": "^17.4.2",
|
|
45
|
+
"vue-tsc": "^3.3.8",
|
|
46
|
+
"webpack": "^5.104.1",
|
|
47
|
+
"webpack-dev-middleware": "^7.4.5",
|
|
48
|
+
"webpack-hot-middleware": "^2.26.1",
|
|
49
|
+
"@ynight/framework": "0.0.1"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"playwright": "^1.60.0",
|
|
53
|
+
"@types/node": "^22.0.0",
|
|
54
|
+
"@types/express": "^5.0.6",
|
|
55
|
+
"@types/webpack": "^5.28.5",
|
|
56
|
+
"@types/webpack-hot-middleware": "^2.25.12",
|
|
57
|
+
"rimraf": "^5.0.10"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"clean": "rimraf dist",
|
|
61
|
+
"build": "rimraf dist && tsc -p tsconfig.json",
|
|
62
|
+
"test": "pnpm run build && node --test test/*.test.mjs",
|
|
63
|
+
"test:integration": "node test/dev.integration.mjs",
|
|
64
|
+
"type-check": "tsc --noEmit -p tsconfig.json",
|
|
65
|
+
"lint": "eslint src"
|
|
66
|
+
}
|
|
6
67
|
}
|