[英]RequireJS/AMD external module resolution
在為我的應用創建的任何模塊中,我可以輸入以下內容:
import ko = require("knockout");
然后,我有一個可以使用的ko
對象。
如果我編寫自己的模塊,例如/app/services/I18n.js
,則必須使用以下路徑導入它:
import i18m = require("services/I18n");
我想知道Knockout模塊做了什么才能使之成為可能,所以我可以這樣做。 我期待它是一些有關Knockout.d.ts
附帶Knockout.TypeScript.DefinitelyTyped
,我只是不知道是什么。
我嘗試在main.ts
我的RequireJS配置中添加一個配置項:
requirejs.config({
baseUrl : "/app",
urlArgs : "bust=" + (new Date()).getTime(),
paths : {
"text" : "lib/requirejs-text/text",
"durandal" : "lib/durandal/js",
"plugins" : "lib/durandal/js/plugins",
"transitions": "lib/durandal/js/transitions",
"knockout" : "lib/knockout.js/knockout",
"jquery" : "lib/jquery/jquery",
"uuid" : "lib/node-uuid/uuid",
"bootstrap" : "lib/bootstrap-sass-official/javascript/bootstrap",
"I18n" : "services/I18n"
}
});
但這不是Visual Studio或ReSharper所“注意到”的,因此沒有任何效果(我不清楚它是否在運行時起作用)。
其長短之處在於我不清楚如何找到模塊。 總是按文件名嗎? 路徑有什么意思嗎? *.d.ts
是否有特殊規定? 感覺就像魔術在繼續。
TypeScript模塊的分辨率有點混亂。 Brocco對*.ts
文件中的本地模塊的回答是正確的。 TS不會讀取require tsconfig.json
有一個新的tsconfig.json
文件(我認為從v1.5開始),您可以在其中為編譯器提供配置。 如果您希望像說Visual Studio這樣的knockout
模塊那樣識別i18n
模塊,則需要在*.d.ts
文件中聲明它們-在TS語言中,這是環境聲明。 聲明文件的特殊之處在於,您必須注意不要從這些文件中的頂層導出任何內容,否則TS會用無意義的錯誤消息轟炸您-因此不允許頂層export
,而是您只聲明什么TS應該理所當然。 這是此用例的示例文件:
// i18n.d.ts
interface I18n {
// Your module's TS interface
translate(key: string): string;
}
declare var i18n: I18n;
declare module "i18n" {
export = i18n;
}
這將告訴TS編譯器,存在一個名為i18n
的頂級模塊,該模塊將在使用指定接口進行編譯后出現。 編譯為AMD模塊后,您需要提供以下信息,以在配置中的運行時找到該模塊:
// require.config.js
requirejs.config({
// ...
paths : {
// ...
// Tell require.js where to find your module
"I18n" : "services/I18n"
}
});
這是我正在使用的設置,希望對您有所幫助。
ko本身並沒有完成什么特別的事情,它與如何解析/找到包有關。 引用本地/內部模塊時,應在其./
加上./
以便模塊解析知道在哪里查找。
至於ko(和其他npm軟件包),它將遍歷文件夾結構,直到找到package.json文件,然后從那里遍歷所有依賴項。 並且在每個依賴項中,它將查看其package.json主字段/屬性以確定要加載的文件/模塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.