创建 yeoman 生成器时无法要求/导入

问题描述 投票:0回答:1

我正在尝试创建 yeoman 生成器,但无法开始。我正在关注有关该主题的此视频,但我什至无法运行我的代码。

这是我的

package.json
文件:

{
  "name": "generator-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "yeoman-generator": "^7.1.0"
  }
}

和我的

index.js
文件:

const Generator = require("yeoman-generator");

module.exports = class extends Generator {
  initializing() {
    this.log("working!");
  }
};

我可以运行

npm link
,没有任何问题,当我尝试运行它时,我可以看到它已被击中,但随后我收到此错误:

ES 模块的 require() ...\generator-test 不支持来自 ...\generator-test\generators pp\index.js 的 ode_modules\yeoman-generator\dist\index.js。

改为更改 ...\generator-test 的要求 ...\generator-test\generators pp\index.js 中的 ode_modules\yeoman-generator\dist\index.js 到所有 CommonJS 模块中都可用的动态 import() 。

所以我尝试了,最后得到了这个

index.js

import Generator from "yeoman-generator";

module.exports = class extends Generator {
  initializing() {
    this.log("working!");
  }
};

这个错误:

不能在模块外部使用 import 语句

我确信我做错了什么,我只是不知道它是什么。 有人能给我指出正确的方向吗?

javascript node.js yeoman yeoman-generator
1个回答
7
投票

更新

Node.js >= v22.0.0 现在实验性支持使用

require
加载 ES 模块。请参阅 使用
require()
加载 ECMAScript 模块。

总结:

  • 使用
    --experimental-require-module
  • ES模块必须完全同步,即没有顶级
    await
  • 确定 ES 模块的常用方法之一已经到位:
    • .mjs
      扩展。
    • "type": "module"
      在 package.json 中。
    • --experimental-detect-module
      已启用。

原答案

首先,您选择的 yeoman 版本会作为 ES 模块发布,这意味着它不能与

require
一起使用。

其次,你的项目被定义为CJS,因为你的package.json没有定义

"type": "module"
,所以默认为普通JS。

如果您想在项目中继续使用 CJS,那么要使用 yeoman,您需要使用 dynamic

import()
表达式,该表达式在 ESM 和 CJS 上下文中都可用。走这条路线,您可能应该使用 top level wait 来定义您的
index.js
模块,因为动态导入使用 Promise。沿着这些思路:

const setup = async () => {
  const Generator = await import('yeoman-generator')

  return class extends Generator {
    initializing() {
      this.log("working!");
    }
  }
}

export default await setup()

更简单的选择是在您的项目中使用 ESM,方法是在 package.json 文件中设置

"type": "module"
并将
require
调用更改为
import

import Generator from "yeoman-generator";

export default class extends Generator {
  initializing() {
    this.log("working!")
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.