Aurelia CLI + Typescript:找不到模块错误

时间:2016-10-22 05:21:07

标签: typescript aurelia-cli

我正在尝试按照Aurelia主页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
  }
}

2 个答案:

答案 0 :(得分:2)

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

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

问题与类型定义无关。正如Meirion Hughes评论的那样,TypeScript编译器在没有它们的情况下工作。

答案 1 :(得分:1)

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

全局安装打字后,您可以运行以下命令:

typings search <LIBRARY_NAME>

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

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

E.g。

typings install dt~react --global

全局标志告诉typings将定义文件安装到项目的全局目录中(因此各种类型都可以访问)。

现在TypeScript应该停止抱怨,不仅如此,你将拥有所有外部库的丰富intellisense(不再在浏览器和编辑器之间来回浏览,因为你已经忘记了api)。

您可以自己找到定义文件(通常可以从DefinitelyTyped存储库获得),只需将其复制到项目中,如果您真的不想因某种原因使用打字机。

另一个选项,实际上只有在库的定义文件不存在的情况下才能使用,是在项目的某个地方声明自己的定义文件并将以下内容放在文件中:

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

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

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

希望有所帮助。