@liujitcn/kratos-uni-app-cli 0.0.31 → 0.0.32
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/README.md +3 -0
- package/package.json +1 -1
- package/src/index.mjs +126 -24
package/README.md
CHANGED
|
@@ -23,6 +23,9 @@ CLI 直接由 `src/index.mjs` 生成文件,不依赖外部模板目录。
|
|
|
23
23
|
- 使用 `--with` 安装额外的已发布模块。
|
|
24
24
|
- 校验模块名和包名,目标目录已存在时拒绝覆盖。
|
|
25
25
|
- core、system 和本地模块的 core 依赖版本统一跟随当前 CLI 包版本。
|
|
26
|
+
- 固定 uni-app、Vite 和 Vue 编译链版本,避免 `latest` 依赖漂移导致脚手架无法启动。
|
|
27
|
+
- 生成 H5 环境配置、页面事务恢复入口和独立 workspace 的 core/system 源码别名。
|
|
28
|
+
- 生成空的生产环境 API 配置,生产构建前必须填写实际后端地址。
|
|
26
29
|
- 生成的宿主在登录、退出和静默退出后重新加载当前身份的导航配置。
|
|
27
30
|
- 为 workspace 根目录、`apps/uni-app` 和每个本地模块生成同级 `README.md`;每个包含
|
|
28
31
|
`package.json` 的生成目录都有对应的结构与职责说明。
|
package/package.json
CHANGED
package/src/index.mjs
CHANGED
|
@@ -29,22 +29,37 @@ export function scaffoldKratosApp(targetPath, options = {}) {
|
|
|
29
29
|
name: projectName,
|
|
30
30
|
description: `Independent pnpm workspace for ${projectName}.`,
|
|
31
31
|
private: true,
|
|
32
|
+
packageManager: 'pnpm@10.13.1',
|
|
32
33
|
scripts: {
|
|
34
|
+
prepare: 'pnpm run prepare:modules',
|
|
35
|
+
'prepare:modules': 'node -e "process.exit(0)"',
|
|
33
36
|
'dev:h5': 'pnpm --filter @liujitcn/kratos-uni-app dev:h5',
|
|
34
37
|
'dev:mp-weixin': 'pnpm --filter @liujitcn/kratos-uni-app dev:mp-weixin',
|
|
35
38
|
'build:h5': 'pnpm --filter @liujitcn/kratos-uni-app build:h5',
|
|
36
39
|
'build:mp-weixin': 'pnpm --filter @liujitcn/kratos-uni-app build:mp-weixin',
|
|
40
|
+
tsc: 'pnpm --recursive --if-present run tsc',
|
|
37
41
|
},
|
|
38
42
|
devDependencies: {
|
|
39
|
-
'@dcloudio/types': '
|
|
40
|
-
'@
|
|
41
|
-
'@
|
|
42
|
-
'
|
|
43
|
-
|
|
44
|
-
'vue-
|
|
43
|
+
'@dcloudio/types': '^3.4.8',
|
|
44
|
+
'@rushstack/eslint-patch': '^1.1.4',
|
|
45
|
+
'@uni-helper/uni-app-types': '1.0.0-alpha.6',
|
|
46
|
+
'@uni-helper/uni-ui-types': '1.0.0-alpha.6',
|
|
47
|
+
'@vue/compiler-sfc': '3.4.21',
|
|
48
|
+
'@vue/eslint-config-prettier': '10.2.0',
|
|
49
|
+
'@vue/eslint-config-typescript': '14.7.0',
|
|
50
|
+
'@vue/tsconfig': '^0.7.0',
|
|
51
|
+
eslint: '9.39.1',
|
|
52
|
+
'miniprogram-api-typings': '^4.0.5',
|
|
53
|
+
prettier: '3.6.2',
|
|
54
|
+
typescript: '5.4.5',
|
|
55
|
+
'vue-tsc': '^1.8.8',
|
|
56
|
+
},
|
|
57
|
+
pnpm: {
|
|
58
|
+
onlyBuiltDependencies: ['esbuild', 'core-js', 'core-js-pure', 'vue-demi'],
|
|
45
59
|
},
|
|
46
60
|
}),
|
|
47
61
|
)
|
|
62
|
+
writeEnvironmentFiles(target)
|
|
48
63
|
write(
|
|
49
64
|
target,
|
|
50
65
|
'README.md',
|
|
@@ -76,20 +91,26 @@ pnpm build:mp-weixin
|
|
|
76
91
|
\`\`\`
|
|
77
92
|
|
|
78
93
|
模块装配入口是 \`apps/uni-app/src/module-manifest.ts\`。新增、删除或调整模块时同步维护该清单,并在模块自己的 README 中记录页面和接口职责。
|
|
94
|
+
|
|
95
|
+
生产构建前请在 \`.env.production\` 中填写实际 API 和静态资源地址;该文件默认留空,不应使用本机地址。
|
|
79
96
|
`,
|
|
80
97
|
)
|
|
81
98
|
const dependencies = {
|
|
82
99
|
'@liujitcn/kratos-uni-app-core': `^${publicPackageVersion}`,
|
|
83
100
|
'@liujitcn/kratos-uni-app-system': `^${publicPackageVersion}`,
|
|
84
|
-
'@dcloudio/uni-app': '
|
|
85
|
-
'@dcloudio/uni-components': '
|
|
86
|
-
'@dcloudio/uni-h5': '
|
|
87
|
-
'@dcloudio/uni-mp-weixin': '
|
|
88
|
-
'@dcloudio/uni-ui': '
|
|
89
|
-
'@dcloudio/vite-plugin-uni': '
|
|
101
|
+
'@dcloudio/uni-app': '3.0.0-5010520260709002',
|
|
102
|
+
'@dcloudio/uni-components': '3.0.0-5010520260709002',
|
|
103
|
+
'@dcloudio/uni-h5': '3.0.0-5010520260709002',
|
|
104
|
+
'@dcloudio/uni-mp-weixin': '3.0.0-5010520260709002',
|
|
105
|
+
'@dcloudio/uni-ui': '^1.4.28',
|
|
106
|
+
'@dcloudio/vite-plugin-uni': '3.0.0-5010520260709002',
|
|
107
|
+
'asmcrypto.js': '^2.3.2',
|
|
108
|
+
'go-captcha-uni': '1.0.6',
|
|
90
109
|
pinia: '^2.0.27',
|
|
91
|
-
|
|
92
|
-
|
|
110
|
+
'pinia-plugin-persistedstate': '^3.2.3',
|
|
111
|
+
'qrcode-generator': '^2.0.4',
|
|
112
|
+
sass: '1.77.8',
|
|
113
|
+
vite: '5.2.8',
|
|
93
114
|
vue: '^3.4.21',
|
|
94
115
|
...Object.fromEntries(modules.map((name) => [`@local/${name}`, 'workspace:*'])),
|
|
95
116
|
...Object.fromEntries(packages.map((name) => [name, 'latest'])),
|
|
@@ -104,11 +125,14 @@ pnpm build:mp-weixin
|
|
|
104
125
|
private: true,
|
|
105
126
|
type: 'module',
|
|
106
127
|
scripts: {
|
|
107
|
-
'
|
|
108
|
-
|
|
109
|
-
'
|
|
110
|
-
'
|
|
111
|
-
|
|
128
|
+
'recover:pages':
|
|
129
|
+
'node -e "import(\'@liujitcn/kratos-uni-app-core/vite\').then(({ recoverStalePageTransaction }) => recoverStalePageTransaction())"',
|
|
130
|
+
'dev:h5': 'pnpm run recover:pages && uni --mode development-h5',
|
|
131
|
+
'dev:mp-weixin': 'pnpm run recover:pages && uni -p mp-weixin --mode development',
|
|
132
|
+
'build:h5':
|
|
133
|
+
'pnpm run recover:pages && UNI_OUTPUT_DIR=../../../../backend/data/uni-app uni build --mode production-h5',
|
|
134
|
+
'build:mp-weixin': 'pnpm run recover:pages && uni build -p mp-weixin --mode production',
|
|
135
|
+
tsc: 'vue-tsc --noEmit -p tsconfig.json',
|
|
112
136
|
},
|
|
113
137
|
dependencies,
|
|
114
138
|
}),
|
|
@@ -154,7 +178,7 @@ pnpm build:mp-weixin
|
|
|
154
178
|
)
|
|
155
179
|
const imports = [
|
|
156
180
|
"import { coreModule } from '@liujitcn/kratos-uni-app-core/module'",
|
|
157
|
-
"import systemModule from '@liujitcn/kratos-uni-app-system'",
|
|
181
|
+
"import { systemModule } from '@liujitcn/kratos-uni-app-system/module'",
|
|
158
182
|
...modules.map((name, index) => `import localModule${index} from '@local/${name}'`),
|
|
159
183
|
...packages.map((name, index) => `import packageModule${index} from '${name}'`),
|
|
160
184
|
]
|
|
@@ -254,11 +278,66 @@ export function createApp() {
|
|
|
254
278
|
write(
|
|
255
279
|
target,
|
|
256
280
|
'apps/uni-app/vite.config.ts',
|
|
257
|
-
`import {
|
|
281
|
+
`import { dirname, resolve } from 'node:path'
|
|
282
|
+
import { fileURLToPath } from 'node:url'
|
|
283
|
+
import {
|
|
284
|
+
createKratosUniPlugin,
|
|
285
|
+
defineConfig,
|
|
286
|
+
kratosApp,
|
|
287
|
+
loadEnv,
|
|
288
|
+
type ConfigEnv,
|
|
289
|
+
type UserConfig,
|
|
290
|
+
} from '@liujitcn/kratos-uni-app-core/vite'
|
|
258
291
|
import { moduleManifest } from './src/module-manifest'
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
292
|
+
const workspaceRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../..')
|
|
293
|
+
const coreRoot = resolve(workspaceRoot, 'node_modules/@liujitcn/kratos-uni-app-core')
|
|
294
|
+
const systemRoot = resolve(workspaceRoot, 'node_modules/@liujitcn/kratos-uni-app-system')
|
|
295
|
+
|
|
296
|
+
function resolveEnv(mode) {
|
|
297
|
+
const modeEnv = loadEnv(mode, workspaceRoot, '')
|
|
298
|
+
if (mode === 'development-h5') return { ...loadEnv('development', workspaceRoot, ''), ...modeEnv }
|
|
299
|
+
if (mode === 'production-h5') return { ...loadEnv('production', workspaceRoot, ''), ...modeEnv }
|
|
300
|
+
return modeEnv
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
export default defineConfig(({ mode }) => {
|
|
304
|
+
const env = resolveEnv(mode)
|
|
305
|
+
const devEnv = mode === 'development-h5' ? loadEnv('development', workspaceRoot, '') : env
|
|
306
|
+
const base = env.VITE_APP_BASE_PATH || (mode === 'production-h5' ? '/app/' : '/')
|
|
307
|
+
return {
|
|
308
|
+
base,
|
|
309
|
+
envDir: workspaceRoot,
|
|
310
|
+
resolve: {
|
|
311
|
+
preserveSymlinks: true,
|
|
312
|
+
alias: [
|
|
313
|
+
{ find: '@', replacement: resolve(coreRoot, 'src') },
|
|
314
|
+
{ find: '@system', replacement: resolve(systemRoot, 'src') },
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
define: {
|
|
318
|
+
process: JSON.stringify({ env: {} }),
|
|
319
|
+
global: 'globalThis',
|
|
320
|
+
'import.meta.env.VITE_APP_PORT': JSON.stringify(env.VITE_APP_PORT || ''),
|
|
321
|
+
'import.meta.env.VITE_APP_BASE_PATH': JSON.stringify(base),
|
|
322
|
+
'import.meta.env.VITE_APP_BASE_API': JSON.stringify(env.VITE_APP_BASE_API || ''),
|
|
323
|
+
'import.meta.env.VITE_APP_API_URL': JSON.stringify(env.VITE_APP_API_URL || ''),
|
|
324
|
+
'import.meta.env.VITE_APP_STATIC_API': JSON.stringify(env.VITE_APP_STATIC_API || ''),
|
|
325
|
+
'import.meta.env.VITE_APP_STATIC_URL': JSON.stringify(env.VITE_APP_STATIC_URL || ''),
|
|
326
|
+
},
|
|
327
|
+
server: {
|
|
328
|
+
host: '0.0.0.0',
|
|
329
|
+
port: Number(env.VITE_APP_PORT || 5004),
|
|
330
|
+
proxy: {
|
|
331
|
+
[env.VITE_APP_BASE_API || '/api']: { changeOrigin: true, target: devEnv.VITE_APP_API_URL },
|
|
332
|
+
'/events': { changeOrigin: true, target: devEnv.VITE_APP_API_URL },
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
build: {
|
|
336
|
+
...(process.env.UNI_OUTPUT_DIR ? { outDir: process.env.UNI_OUTPUT_DIR, emptyOutDir: true } : {}),
|
|
337
|
+
sourcemap: process.env.NODE_ENV === 'development',
|
|
338
|
+
},
|
|
339
|
+
plugins: [kratosApp({ modules: moduleManifest }), createKratosUniPlugin()],
|
|
340
|
+
}
|
|
262
341
|
})
|
|
263
342
|
`,
|
|
264
343
|
)
|
|
@@ -342,6 +421,29 @@ export default module
|
|
|
342
421
|
return target
|
|
343
422
|
}
|
|
344
423
|
|
|
424
|
+
function writeEnvironmentFiles(target) {
|
|
425
|
+
write(
|
|
426
|
+
target,
|
|
427
|
+
'.env.development',
|
|
428
|
+
'VITE_APP_BASE_API=/api\nVITE_APP_API_URL=http://localhost:7001\nVITE_APP_STATIC_API=\nVITE_APP_STATIC_URL=http://localhost:7001\n',
|
|
429
|
+
)
|
|
430
|
+
write(
|
|
431
|
+
target,
|
|
432
|
+
'.env.development-h5',
|
|
433
|
+
'VITE_APP_PORT=5004\nVITE_APP_BASE_PATH=/\nVITE_APP_BASE_API=/api\nVITE_APP_API_URL=http://localhost:7001\nVITE_APP_STATIC_API=\nVITE_APP_STATIC_URL=http://localhost:7001\n',
|
|
434
|
+
)
|
|
435
|
+
write(
|
|
436
|
+
target,
|
|
437
|
+
'.env.production',
|
|
438
|
+
'VITE_APP_BASE_API=/api\nVITE_APP_API_URL=\nVITE_APP_STATIC_API=\nVITE_APP_STATIC_URL=\n',
|
|
439
|
+
)
|
|
440
|
+
write(
|
|
441
|
+
target,
|
|
442
|
+
'.env.production-h5',
|
|
443
|
+
'VITE_APP_BASE_PATH=/app/\nVITE_APP_BASE_API=/api\nVITE_APP_API_URL=\nVITE_APP_STATIC_API=\nVITE_APP_STATIC_URL=\n',
|
|
444
|
+
)
|
|
445
|
+
}
|
|
446
|
+
|
|
345
447
|
function validateModuleName(name) {
|
|
346
448
|
if (!/^[a-z][a-z0-9-]*$/.test(name)) throw new Error(`模块名无效:${name}`)
|
|
347
449
|
}
|