我正在尝试创建 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 语句
我确信我做错了什么,我只是不知道它是什么。 有人能给我指出正确的方向吗?
更新
Node.js >= v22.0.0 现在实验性支持使用
require
加载 ES 模块。请参阅 使用 require()
加载 ECMAScript 模块。
总结:
--experimental-require-module
。await
。.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!")
}
}