【问题标题】:Aurelia CLI + Typescript: Cannot find module errorsAurelia CLI + Typescript:找不到模块错误
【发布时间】:2016-10-22 05:21:06
【问题描述】:

我正在尝试按照 Aurelia Homepage here 上的视频教程设置一个基本的 Aurelia 项目。我想我已经按照视频中给出的确切步骤进行了操作(只是将 ES6 更改为 Typescript)。

当我尝试通过执行au run --watch 来运行应用程序时,它给了我这个错误:

ReferenceError: define is not defined
at Object.<anonymous> (/aurelia_project/tasks/build.js:1:63)

进一步调查,当我打开aurelia_project目录时,我发现所有.ts文件都充满了cannot find module错误。例如,

[ts] Cannot find module 'gulp'.
[ts] Cannot find module 'aurelia-cli'.

等等..

我是否必须为typescript cli 执行一些额外的步骤才能解析这些模块?

如果有帮助,这里是tsconfig.json

{
  "compileOnSave": false,
  "compilerOptions": {
    "sourceMap": true,
    "target": "es5",
    "module": "amd",
    "declaration": false,
    "noImplicitAny": false,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "moduleResolution": "node",
    "lib": ["es2015", "dom"]
  },
  "exclude": [
    "node_modules",
    "aurelia_project"
  ],
  "filesGlob": [
    "./src/**/*.ts",
    "./test/**/*.ts",
    "./typings/index.d.ts",
    "./custom_typings/**/*.d.ts"
  ],
  "atom": {
    "rewriteTsconfig": false
  }
}

【问题讨论】:

  • 如果您创建了一个普通的 cli 项目,并且在安装了 dep 和 au run 之后,您会收到错误消息,那么有些问题。要么是您的旧 nodejs 版本,要么只是您安装的 cli 版本中存在错误。其次,未设置 aurelia_project 文件夹内容的类型;但会编译得很好。如果你想要正确的类型,你需要为使用的 gulp 模块安装类型。例如在 tsconfig 中设置 "moduleResolution": "node" 然后npm install @types/gulp --save-dev 进行打字。

标签: typescript aurelia


【解决方案1】:

删除aurelia_json/tasks 中的所有*.js 文件。然后重复au run --watch

为什么?您错误地将 aurelia_json/tasks TypeScript 转换为 JavaScript,您不想这样做,因为 Aurelia CLI 使用 gulp-typescript。删除aurelia_json/tasks中的所有*.js文件就可以了。

问题与类型定义无关。正如 Meirion Hughes 所说,TypeScript 编译器在没有它们的情况下也能正常工作。

【讨论】:

  • 谢谢,成功了。你知道是什么导致aurelia_json/tasks typescript 文件被转译成 javascript 吗?
  • 另外,我注意到虽然au run --watch 命令有效并启动了应用程序,但.ts 文件中仍然存在打字稿错误。我可以做些什么来修复它们吗?
  • @akshayKhot 恐怕我不知道您的后续问题的答案。
【解决方案2】:

在使用带有 TypeScript 的外部库时有几个选项。一种选择是导入给定库的定义 (.d.ts) 文件。有多种方法可以做到这一点。我个人更喜欢使用打字(npm i typings -g)。

在全局安装 Typings 后,您可以运行以下命令:

typings search <LIBRARY_NAME>

这将为您提供搜索的匹配列表。选择您想要的库以及从哪个来源下载它。大多数将来自 dt (DefinitelyTyped)。然后运行以下命令:

typings install <SOURCE>~<LIBRARY_NAME> --global

例如

typings install dt~react --global

全局标志告诉 Typings 将定义文件安装到项目中的全局目录中(因此类型可以在任何地方访问)。

现在 TypeScript 应该停止抱怨了,不仅如此,您的所有外部库都将拥有丰富的智能感知(不再因为忘记了 api 而在浏览器和编辑器之间来回切换)。

如果您出于某种原因确实不想使用类型,您可以自己找到定义文件(通常可从DefinitelyTyped 存储库中获得)并将其复制到您的项目中。

另一个选项,只有在库的定义文件不存在时才应该使用,是在项目中的某处声明您自己的定义文件并将以下内容放入文件中:

declare module '<MODULE_NAME>' {
    let <LIBRARY_NAME>: any;
    export default <LIBRARY_NAME>;
}

这告诉 TypeScript MODULE_NAME 存在,所以停止抱怨,它会导出默认类型为 any 的 LIBRARY_NAME。当然,使用这种方法,您的库不会获得任何智能感知。

最后一个选择当然是自己创建定义文件(如果不存在),然后将其贡献给DefinitelyTyped。我相信这将不胜感激:)

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2020-08-15
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多