2017-05-29 22 views
7

我們要使用匯總與角4 /打字稿及NPM 我們有公司內的下列要求:間接引用遠程JavaScript URL

  • 某些球隊創造需要被集中(如CDN JS庫)
  • 這些庫位於遠程URL的後面,不應該在應用程序本地存在(原因是這些庫更改太頻繁)
  • 庫(應用程序)的使用者安裝npm包以使用庫
  • 本地安裝的NPM包中包含一個Javascript門面文件或捆綁這使遠程鏈接到JS庫中的現有遠程URL
  • 故宮包還包含一個打字稿定義文件背後
  • 的目標是,消費者沒有按」 t需要添加帶有URL的腳本標籤(他不應該意識到這一點)
  • 本地安裝的Javascript文件可能與應用程序代碼捆綁在一起
  • 如果可能的話,新版本的庫將向後兼容

使用Typescript/Javascript/NPM/Rollup來實現這一點的最佳方法是什麼? 我們將使用ES2015語法轉換爲commonJS語法。

+0

該解決方案是相當不錯的,在所有的點,但我會建議您保持簡單的想法:在打字稿中爲你的圖書館創建一個項目。 – jeorfevre

回答

1

該解決方案太複雜。 創建這些JS庫的團隊應該在URL後面放置一個包。 團隊應該在這些軟件包上啓用該URL並啓用電子標籤緩存,以便用戶始終擁有最新版本。如果部署了新版本的捆綁包,則http/1客戶端必須自動重新下載該捆綁包。

用戶必須將URL本身或帶有json文件的機制設置爲信息駐留在json文件(如清單)中的位置。

該應用程序的開發人員可以通過npm接收包含所有類型框架庫的d.ts文件。您不需要導入模塊,因爲它是一個遠程URL。所以你不需要導入任何東西,因爲它可以保證由於腳本標記引用了庫。

2

我不認爲彙總有類似webpack dll plugin的東西,所以,我的答案可能看起來不相關,但我認爲你可以認爲它是一個很好的起點,並開始尋找類似的彙總。

庫生活在一個CDN

  1. 與其對應的DLL Reference這究竟說明了如何需要導出組件創建DLL
  2. 使用自解釋路徑並保持其一致性,如https://cdn.mydomain.com/<libraryName>/<version>/<libraryName>.{js,json,d.ts}(請求者應添加?<cacheBustingUID>以避免客戶端緩存問題)。除了正常的版本控制之外,我還建議您使用關鍵字作爲version字段,這樣可以實現always true path,它指向最新版本的軟件包:(https://cdn.mydomain.com/foo/1.0.0/foo.{js,json,d.ts}https://cdn.mydomain.com/foo/latest/foo.{js,json,d.ts})。
  3. 解決所有文件,並開始開發服務器(記住的WebPack允許返回一個承諾作爲一個配置)
module.exports = env => { 
    const libs = ((name, version, exts) => (
    exts.map(ext => `https://cdn.mydomain.com/${name}/${version}/${name}.${ext}`) 
))('foo', 'latest', ['js', 'd.ts', 'json']) 

    return Promise 
    .all(libs.map(fetch)) 
    .then([library, definitions, DLLReference] => { 
     // what to do? 
     // you can also inject the dynamic paths through `webpackDefinePlugin` 
    }) 
} 
+0

關於?。不要在cdn文件上使用eTags是不是一個好主意? –

+0

'etags'確實更加一致,並且不會排除其他,因此,絕對保持'eTag'一致,並且如果某些客戶端需要強制重新下載,它還可以追加一個查詢字符串。 – Hitmands

+0

我對webpack並不是很熟悉,但是我可以讀取webpack dll插件用於創建供應商js + json清單。然後消費者需要放置一個引用vendor.js的<腳本標記,並使用webpack dll引用來引用json文件。消費者應用程序的目標是什麼?爲了能夠創建import/require語句?在設置中,團隊使用不同的模塊捆綁器(比如彙總和webpack)並不是不可能的。 –