2016-10-22 103 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。我敢肯定,將不勝感激:)

希望有所幫助。