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

Lui*_*iso 3 javascript node.js yeoman yeoman-generator

我正在尝试创建 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

和我的index.js文件:

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

module.exports = class extends Generator {
  initializing() {
    this.log("working!");
  }
};
Run Code Online (Sandbox Code Playgroud)

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

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

而是将 ...\generator-test\generators\app\index.js 中的 ...\generator-test\node_modules\yeoman-generator\dist\index.js 的需求更改为动态 import() ,可在所有 CommonJS 模块。

所以我尝试了一下,结果是这样的index.js

import Generator from "yeoman-generator";

module.exports = class extends Generator {
  initializing() {
    this.log("working!");
  }
};
Run Code Online (Sandbox Code Playgroud)

和这个错误:

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

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

mor*_*ney 6

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

其次,你的项目被定义为CJS,因为你的package.json没有定义"type": "module",所以默认为普通JS。

如果您想继续在项目中使用 CJS,那么要使用 yeoman,您需要使用在 ESM 和 CJS 上下文中都可用的动态表达式。 import()走这条路,您可能应该使用顶级等待来定义您的index.js模块,因为动态导入使用承诺。沿着这些思路:

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

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

export default await setup()
Run Code Online (Sandbox Code Playgroud)

更简单的选项是通过"type": "module"在 package.json 文件中进行设置并将调用更改requireimport.

import Generator from "yeoman-generator";

export default class extends Generator {
  initializing() {
    this.log("working!")
  }
}
Run Code Online (Sandbox Code Playgroud)