【问题标题】:How to use stage 3 syntax in svelte/sapper?如何在 svelte/sapper 中使用第 3 阶段语法?
【发布时间】:2026-01-26 16:25:02
【问题描述】:

我想在我的工兵项目中使用类属性和私有字段。显然它们现在必须由 babel 进行预处理。

我尝试在rollup.config.js中添加相应的babel插件,只是实现了一些东西。

  1. babel rollup 插件仅在 legacy 模式下使用。
  2. 服务器部分根本不使用 babel。

我尝试将 babel rollup 插件添加到这样的服务器插件的末尾,

babel({
    extensions: ['.js', '.mjs', '.html', '.svelte'],
    runtimeHelpers: true,
    exclude: ['node_modules/@babel/**'],
    plugins: [
        '@babel/plugin-proposal-class-properties',
        '@babel/plugin-proposal-private-methods',
    ],
}),

但是好像根本没有生效。

我也将它添加到客户端插件中(在遗留条目之前),但它抱怨我需要添加 @babel/plugin-syntax-dynamic-import,所以看起来 babel 必须识别整个语法才能进行预处理,而我没有真的很想为现代浏览器编译动态导入。

如何在 sapper 中启用 esnext 语法?

【问题讨论】:

    标签: babeljs ecmascript-next svelte sapper


    【解决方案1】:

    您需要使用 rollup-plugin-svelte 中的 preprocess 选项预处理 <script> 的内容:

    plugins: [
      svelte({
        // ...
        preprocess: {
          script: ({ content }) => {
            return transformWithBabel(content);
          }
        },
        // ...
      })
    ]
    

    在理想情况下,我们应该有一个现成的预处理器插件来执行此操作;事实上,transformWithBabel 函数现在留给读者作为练习。本质上它会涉及到import * as babel from '@babel/core' 并直接使用 Babel API,我保证这会很有趣。

    注意@babel/plugin-syntax-dynamic-import 不编译动态导入,它只允许 Babel 解析它。没有它,Babel 无法从 <script> 中的代码生成有效的 AST。

    【讨论】:

    • 感谢里奇!我会试一试,但想知道这是否会包含两次运行时帮助程序/polyfills。
    • 如果我添加动态导入插件,并且在服务器情况下,将 babel 插件放在 commonjs 之前,不知何故一切正常。
    最近更新 更多