【问题标题】:JavaScript private class methods with Snowpack带有 Snowpack 的 JavaScript 私有类方法
【发布时间】:2020-10-20 02:34:02
【问题描述】:

我在前端代码中使用private JavaScript class methods,在我的开发工作流程中使用Snowpack

目前(从 v2.15.0-pre.5 开始),Snowpack 似乎不能很好地与私有类方法配合使用,即,在使用 snowpack build 构建时,以下内容会失败:

export class TestClass {
  #test() {
    console.log("testing...");
  }

  test() {
    this.#test();
  }
}

要复制的 repo 是 here。克隆后,运行:

npm install
npm run build

我已经使用 Snowpack 打开了issue,但显然问题在于与 Rollup 的集成,修复不是优先事项。

据我了解,要解决它,我们需要:

在我深入学习 Rollup 生态系统之前,我想知道是否有人可以提供这方面的示例?

或者也许还有其他方法可以让它发挥作用?

由于时间限制,我现在重新使用 _methodName 而不是 #methodName,但我计划在时间允许时提供修复。

【问题讨论】:

  • 使用 Snowpack 的自定义汇总插件将 acorn-private-methods 注入 acornInjectPlugins 确实 not 似乎可以正常工作,来自 my testing。似乎这仅适用于项目源,而不适用于依赖项;这似乎与 FredKSchott 在链接的 GitHub 问题上提到的一致:“因为 mod101 被视为依赖项,所以它通过不同的工作流程”。我认为可能需要采用不同的方法。
  • @concision,有趣!感谢您花时间验证这一点。 Snowpack 已经与项目源中的私有方法很好地配合,就像 acorn-private-methods 注入一样。
  • 很高兴听到它对您有所帮助。我很惊讶以前似乎没有人遇到过这个问题。这可能对未来的读者有用,所以我想我会将解决方案打包为 npm 上可用的 rollup 和 snowpack 插件,并将它们作为答案发布。可能需要一两天。
  • @concision,那太好了,谢谢!我已经创建了this snowpack plugin,因为我更喜欢声明性 JSON 配置而不是snowpack.config.js 。如果您可以通过 pluginOptions 参数使其可配置,那就太好了,例如指定要使用的确切 Acorn 插件。
  • 我已经添加了一个插件实现的答案,如您所描述的。它在 NPM 上以snowpack-plugin-acorn-injection 提供。这支持声明性 JSON Snowpack 配置。

标签: javascript rollupjs snowpack acorn


【解决方案1】:

Snowpack 插件:snowpack-plugin-acorn-injection

扩展 @noseratio 的工作,我创建了一个名为 snowpack-plugin-acorn-injection 的 NPM 依赖项,它将相关的 Acorn 插件注入到 Rollup 的内部配置中。

插件可用:


示例

依赖安装

安装所需的插件和相关 Acorn 插件(例如,acorn-stage3)作为开发依赖项。

步骤:

  • npm:
    npm install --save-dev snowpack-plugin-acorn-injection acorn-stage3
    
  • Yarn:
    yarn add --dev snowpack-plugin-acorn-injection acorn-stage3
    

配置雪包

使用snowpack-plugin-acorn-injection 和相关的Acorn 插件配置项目的Snowpack configuration

{
  ...
  "plugins": [
    [
      "snowpack-plugin-acorn-injection",
      {
        "plugins": [
          "acorn-stage3"
        ]
      }
    ]
  ],
  ...
}

【讨论】:

    【解决方案2】:

    我已经想通了,使用 Rollup.js options hook 和 acorn-stage3 acorn 插件,repo

    acorn-private-methods 也可以使用(如果只需要私有方法)。

    • 创建一个自定义的 Rollup.js 插件,我称之为@noseratio/rollup-acorn-conf
    "use strict";
    
    module.exports = function plugin(hostOpts = {}) {
      return { 
        name: 'rollup-acorn-conf',
    
        options: rollupOpts => { 
          console.log("Enabling 'acorn-stage3'...");
          rollupOpts.acorn = rollupOpts.acorn ?? {};
          rollupOpts.acorn.ecmaVersion = 2020;
          rollupOpts.acornInjectPlugins = rollupOpts.acornInjectPlugins ?? [];
          rollupOpts.acornInjectPlugins.push(require('acorn-stage3'));
          return rollupOpts;
        }
      };
    };
    

    它的package.json

    {
      "name": "@noseratio/rollup-acorn-conf",
      "version": "0.1.1",
      "description": "Enable ES2020 features (Stage 3) for Rollup.js",
      "homepage": "https://github.com/noseratio/snowpack-discussions-1209",
      "main": "index.js",
      "scripts": {},
      "devDependencies": {
        "acorn-stage3": "^4.0.0"
      }
    }
    
    • snowpack.config.js:
      installOptions: {
        rollup: { 
          plugins: [require('@noseratio/rollup-acorn-conf')()]
        }
      }
    

    【讨论】:

    • A gist 用于声明性 snowpack.config.json
    猜你喜欢
    • 2011-12-08
    • 2015-06-26
    • 1970-01-01
    • 2021-05-05
    • 2011-02-11
    • 1970-01-01
    • 2017-05-23
    • 2015-06-30
    • 2022-11-20
    相关资源
    最近更新 更多