⭐️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 修复了该问题