⭐️Farm v1.1.0 支持了 Top Level Await
、Node 懒编译
等新特性,并修复了部分 Bug。
不了解 Farm?参考
一、新特性
1.1 Top Level Await
Farm 从 v1.1.0
开始支持 top level await
,开箱即用,无需任何额外配置。 请注意,top level await
仅适用于**原生支持async/await
的浏览器,当针对旧版浏览器时,使用 top level await
将引发运行时错误。
使用示例:
ts
// data.json
[1, 2, 3]
// data.ts
const data = await import('./data.json');
// 使用顶层 await
export default await Promise.resolve(data.default);
// index.ts
import data from './data.ts'; // 直接 import 异步模块
console.log(data); // [1, 2, 3]
Farm 在 v1.1.0 中引入了 异步模块
(async module
) 的概念,使用 top-level wait
的模块将成为 异步模块
,静态导入 异步模块
的模块也将是 异步模块
。 对于上面的示例:data.ts
是 异步模块
,因为它使用了 top level await
,index.ts
也是 异步模块
,因为它静态导入 异步模块 data.ts
。
Farm top level await 完全按照
top level await
的规范实现,包括编译时和运行时两部分都进行了支持
对于没有使用 top level await
的项目,所有模块都是 同步模块
(sync module
),编译产物跟之前比不会有任何差异。
async module
是 Farm 内部的概念,一般用户不会关心它,但是对于运行时插件作者来说,如果想扩展 farm 模块系统,可能需要注意模块的执行可能是异步的
1.2 Node 懒编译
之前 懒编译
仅适用于浏览器,从 v1.1.0
开始,在 targetEnv
是 node
时也可以使用 懒编译
。 Node 的懒编译可以大大提升 SSR Node 侧编译性能,例如,如果有多个动态路由,那么这些动态路由的代码直到执行时才会进行编译,能大大减少大型项目的编译时间,提升开发体验。
例子:
ts
// dynamic.ts
export const a = 'aaa';
// index.ts
console.log('script start');
import('./dynamic.js').then((mod) => {
console.log('111' + mod.a);
});
在上面的例子中,只有当执行 index.ts
时,dynamic.ts
才会被编译。
1.3 swc_core
更新到 v0.90
将swc_core
从v0.88
更新为0.90
,修复了一些 SWC 底层的 bug。如果您使用了 SWC
插件,请确保该插件与swc_core v0.90
兼容。
二、Bug 修复
2.1 lib 构建不再注入 polyfill
对于 library 的构建,polyfill 应由上层 APP 来进行处理,因此 v1.1.0
开始,不再对 library 注入 polyfill.
ts
export default defineConfig({
compilation: {
input: { index: './index.ts' }
}
});
在上面的配置中,Farm 不再为 ./index.ts
注入 polyfill。
修复随机的 cache panic
由于并发问题,频繁保存时,可能会出现如下 cache 导致的 panic:
文本
thread '<unnamed>' panicked at crates\plugin_runtime\src\render_resource_pot\mod.rs:307:12:
failed to write resource pot to runtime object cache: Os { code: 2, kind: NotFound, message: "系统找不到指定的文件。" }
v1.1.0 修复了该问题