2016-12-06 21 views
1

我正在嘗試配置我的代碼庫,以便能夠同時執行JiT和AoT,以便我可以將JiT用於本地開發和AoT進行生產。我遵循angular documentation here,並已成功獲得兩個單獨工作。Angular 2 - 爲JIT和AoT導入外部庫

我面臨的問題是當我嘗試導入外部庫時,特別是時刻-js。

對於JIT,我使用SystemJS,該配置是

// systemjs.config.js 

System.config({ 
    map: { 
     // ... 
     moment: '/node_modules/moment', 
    }, 
    packages: { 
     // ... 
     moment: { 
      defaultExtension: 'js' 
     } 
    } 
}); 

然後在打字稿組件導入,我可以做

// some-component.component.ts 

import * as moment from 'moment/moment'; 

這只是正常爲地方發展。

但是,當我嘗試使用匯總進行AoT編譯時,出現Cannot call a namespace ('moment')編譯錯誤。我解決了以下this thread here這個問題,所以一對夫婦更改彙總後的配置在組件import語句應該是

// some-component.component.ts 

import moment from 'moment'; 

偉大的工程的AOT和彙總,但現在SystemJS有了解的問題。

我似乎無法擺脫循環。我可以得到一個工作,但不能同時工作。有沒有辦法讓SystemJS瞭解彙總所需的導入語句?我不認爲它可能是相反的。

編輯

我沒有找到一種方法,至少使它的工作,但它並不完全理想。我只是將其聲明爲any,然後使用腳本標記從外部加載到庫中,而不是導入它。所以,現在的成分是

// some-component.component.ts 

declare const moment: any; 

正如我所說的,這是不理想的,因爲這並不讓我與AOT構建捆綁的時刻,這也迫使打字稿解釋「時刻」 var當成any所以現在它不知道它的類型。所以這仍然不能完全回答我的問題,但這至少起作用。

+0

我是你提到的線程的OP。你有沒有設法找到一個更好的方式來做到這一點?我很好奇爲什麼沒有人會談論這個,這是一個相當嚴重的限制... –

+0

不幸的是沒有。我對這個特定項目的唯一依賴是時刻,所以我決定只用我的黑客解決方案,因爲我找不到任何其他方式來做到這一點。我考慮過其他選項,比如嘗試使用環境變量來控制使用哪個導入語句,但我從來沒有嘗試過。我也想知道webpack是否可以像進口一樣處理AoT,但是再一次,從未嘗試過。 – davidmk

回答

1

保持進口:

import * as moment from 'moment'; 

並添加插件rollup.js:

{ 
    name: 'replace moment imports', 
    transform: code => ({ 
     code: code.replace(/import\s*\*\s*as\s*moment/g, 'import moment'), 
     map: { mappings: '' } 
    }) 
}, 
+1

請不要將[相同的答案添加到多個問題](http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-ad ??da-duplicate-answer-to-several-問題)。一旦你獲得了足夠的聲望,請回答最好的一個,並將其餘標記爲重複。如果它不是重複的,請調整問題的帖子。 –

+0

你上面有紅色的問題嗎?它根本不是重複的 - 只需要以類似的方式解決即可。 –