2016-10-22 82 views
2

我试图建立继Aurelia大街首页here视频教程基本奥里利亚项目。我想我已经遵循了视频中给出的确切步骤(只是将ES6更改为Typescript)。奥里利亚CLI +打字稿:找不到模块的错误

当我试图通过执行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额外的步骤OT解决这些模块?

这里是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 
    } 
} 
+0

如果你已经做了一个简单的cli项目,并在dep安装和'au run'后得到那个错误消息,那么一些东西是错误的。无论是在旧的nodejs版本上,还是只安装了您所安装的cli版本中的错误。其次,'aurelia_project'文件夹的类型没有设置;但会编译得很好。如果你想要正确的类型,那么你需要为使用的吞咽模块安装类型。例如在tsconfig中设置“moduleResolution”:“node”,然后在'npm install @ types/gulp --save-dev'中输入类型。 –

回答

2

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

为什么?由于Aurelia CLI使用gulp-typescript,您错误地将您的TypeScript脚本转换为JavaScript,因此您不想这样做。删除aurelia_json/tasks中的所有*.js文件,你会没事的。

该问题与类型定义无关。正如Meirion Hughes所评论的,TypeScript编译器没有它们。

+0

谢谢,这工作。你知道是什么导致'aurelia_json/tasks'打字稿文件被转译成javascript吗? – akshayKhot

+0

此外,我注意到,尽管'au run --watch'命令可以运行并启动应用程序,但在'.ts'文件中仍然存在typescript错误。我能做任何事情来解决它们吗? – akshayKhot

+0

@akshayKhot恐怕我不知道你的后续问题的答案。 –

1

有使用带有打字稿外部库时,有一对夫妇的选择。一种选择是导入给定库的定义(.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 

全球标志告诉分型的定义文件安装到您的项目在全球目录(这样的类型都可以访问无处不在)。

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

你能够找到定义文件自己(通常可以从DefinitelyTyped库),并简单地将其复制到你的项目,如果你真的不想使用分型的某些原因。

另一种选择,这确实应该如果库中的定义文件不存在,只能用,就是某处声明自己定义文件在您的项目,并把下面的文件中:

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

这告诉TypeScript MODULE_NAME存在,所以不要抱怨,并且它会导出LIBRARY_NAME,它是默认的any类型。当然,用这种方法你不会对你的图书馆有任何智能感知。当然

最后一个选项是创建定义文件自己(如果不存在),那么它有助于DefinitelyTyped。我敢肯定,将不胜感激:)

希望有所帮助。