@nasti-toolchain/nasti 2.2.0 → 2.4.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.
package/README.md CHANGED
@@ -23,7 +23,8 @@
23
23
  - **Vite 插件兼容** - 直接使用现有 Vite/Rollup 插件(resolveId / load / transform)
24
24
  - **内置 React 支持** - JSX 自动转换 + React Fast Refresh HMR
25
25
  - **内置 Vue 支持** - SFC 编译 + Vue HMR(可选依赖 `@vue/compiler-sfc`)
26
- - **Electron 41+ 支持** - 一键构建主进程 / Preload / 渲染进程,支持 ESM 主进程
26
+ - **Electron 41+ 支持** - React/Vue renderer + 主进程 / Preload,支持 ESM 主进程
27
+ - **Environment Driver** - 可桥接 Rspeedy 等非 Rolldown 工具链,含 build/dev/watch 生命周期
27
28
  - **Monaco Editor 集成** - 内置 `monacoEditorPlugin`,预打包 Web Worker,修复 HMR 期间的 EMFILE
28
29
  - **Dev Server + HMR** - 开发服务器 + WebSocket 热模块替换
29
30
  - **TypeScript 优先** - 原生 TS 支持,零配置
@@ -210,9 +211,11 @@ import { defineConfig } from '@nasti-toolchain/nasti'
210
211
 
211
212
  export default defineConfig({
212
213
  target: 'electron',
214
+ framework: 'auto', // 自动识别 React / Vue
213
215
  electron: {
214
216
  main: 'src/electron/main.ts', // 主进程入口
215
217
  preload: 'src/electron/preload.ts', // Preload 脚本(可传数组)
218
+ renderer: 'src/renderer/index.html', // React / Vue renderer HTML
216
219
  mainFormat: 'cjs', // 主进程输出格式:'cjs' | 'esm'
217
220
  preloadFormat: 'cjs', // Preload 输出格式
218
221
  nodeTarget: 'node22', // Electron 41 捆绑 Node 22
@@ -222,6 +225,19 @@ export default defineConfig({
222
225
  })
223
226
  ```
224
227
 
228
+ Vue renderer 直接使用标准 SFC:
229
+
230
+ ```ts
231
+ // src/renderer/main.ts
232
+ import { createApp } from 'vue'
233
+ import App from './App.vue'
234
+
235
+ createApp(App).mount('#app')
236
+ ```
237
+
238
+ 生产 renderer 默认使用 `base: './'`,因此 `BrowserWindow.loadFile()` 可以正确加载
239
+ hashed JS/CSS;显式配置其他 `base` 时保留用户值。
240
+
225
241
  开发:
226
242
 
227
243
  ```bash
@@ -269,6 +285,89 @@ app.whenReady().then(createWindow)
269
285
 
270
286
  > 详细说明见 [Electron 指南](https://nasti.zixiaolabs.com/pages/electron.html)。
271
287
 
288
+ ## External Environment Driver
289
+
290
+ Rspeedy 等外部工具链可以接管单个环境,同时保留 Nasti 的 CLI、日志与多环境编排:
291
+
292
+ ```ts
293
+ export default defineConfig({
294
+ environments: {
295
+ lynx: {
296
+ consumer: 'client',
297
+ driver: 'rspeedy',
298
+ },
299
+ },
300
+ plugins: [pluginRspeedyBridge()],
301
+ })
302
+ ```
303
+
304
+ bridge 插件通过 `createEnvironmentDriver()` 提供 `build`、`serve`、`watchChange`
305
+ 和 `close`,并可使用 `setup(api)`、`api.expose/useExposed` 与
306
+ `afterBuildApp(results, api, context)` 协调多个插件或环境。
307
+
308
+ ## 原生多环境聚合(Lynx BG / MT)
309
+
310
+ 纯 Lynx 应用可以禁用默认 Web client,把同一入口交给两套独立的 client-consumer
311
+ Rolldown 环境。每套环境都有独立 module graph、resolve conditions、插件上下文和输出目录:
312
+
313
+ ```ts
314
+ export default defineConfig({
315
+ environments: {
316
+ client: { buildEnabled: false },
317
+ 'lynx-background': {
318
+ consumer: 'client',
319
+ entry: 'src/index.ts',
320
+ resolve: { conditions: ['lynx-background', 'browser', 'import'] },
321
+ },
322
+ 'lynx-main-thread': {
323
+ consumer: 'client',
324
+ entry: 'src/index.ts',
325
+ resolve: { conditions: ['lynx-main-thread', 'browser', 'import'] },
326
+ },
327
+ },
328
+ plugins: [pluginVueLynxNative()],
329
+ })
330
+ ```
331
+
332
+ Environment API 是 `conditionNames` 和 `mainFields` 的唯一高层配置入口:
333
+ 请使用 `environments.<name>.resolve.conditions` / `mainFields`(client 也可使用
334
+ top-level `resolve`)。这些值会无条件覆盖
335
+ `build.rolldownOptions.resolve.conditionNames` / `mainFields` 中的对应底层选项。
336
+
337
+ 在生产构建的 bundle/finalizer 相关钩子(如 `generateBundle`、`buildEnd`、
338
+ `closeBundle`)中,`this.environment` 会准确指向当前 BG/MT 环境。unbundled
339
+ dev 调用路径可能不提供该对象,开发期插件不得依赖 `this.environment`;应使用
340
+ Environment API 的显式环境参数。插件可登记结构化 manifest,并在 app 级
341
+ finalizer 中直接查询 entry/artifact,最后写出聚合 bundle:
342
+
343
+ ```ts
344
+ const pluginVueLynxNative = () => ({
345
+ name: 'vue-lynx:native',
346
+
347
+ generateBundle() {
348
+ this.environment.setBuildMetadata({
349
+ manifest: { thread: this.environment.name },
350
+ })
351
+ },
352
+
353
+ afterBuildApp(_results, _api, app) {
354
+ const background = app.getEntry('lynx-background', 'index')
355
+ const mainThread = app.getEntry('lynx-main-thread', 'index')
356
+ if (!background || !mainThread) throw new Error('Missing Lynx thread entry')
357
+
358
+ app.emitFile({
359
+ type: 'asset',
360
+ fileName: 'main.native.lynx.bundle',
361
+ source: encodeLynxBundle({ background, mainThread }),
362
+ })
363
+ },
364
+ })
365
+ ```
366
+
367
+ `build()` 的 `environmentResults` 会包含原生环境自动推导的 `entries`、插件登记的
368
+ `manifest/stats` 及完整 `output`;app 级产物同时出现在 `BuildResult.appOutput`。
369
+ 这些 API 只负责双线程编排与聚合,Vue SFC/worklet、Lynx CSS 和 encoder 由后续工具链插件实现。
370
+
272
371
  ## Monaco Editor 支持
273
372
 
274
373
  内置 `monacoEditorPlugin`(对标 `vite-plugin-monaco-editor`),解决两个老大难问题:
package/bin/nasti.js CHANGED
File without changes
package/client/hmr.ts CHANGED
@@ -3,10 +3,11 @@
3
3
 
4
4
  export interface HotModule {
5
5
  accept(cb?: (mod: any) => void): void
6
+ accept(dep: string, cb: (mod: any) => void): void
6
7
  accept(deps: string[], cb: (mods: any[]) => void): void
7
- dispose(cb: (data: any) => void): void
8
- prune(cb: () => void): void
9
- invalidate(): void
8
+ dispose(cb: (data: Record<string, any>) => void | Promise<void>): void
9
+ prune(cb: (data: Record<string, any>) => void | Promise<void>): void
10
+ invalidate(message?: string): void
10
11
  data: Record<string, any>
11
12
  }
12
13