2017-03-26 28 views
8

是否需要修改NPM軟件包以與Angular 2兼容(例如添加類型,爲其制定指令)還是將現有的軟件包工作?如果它們不兼容,我怎麼知道什麼是和什麼不兼容?哪個npm軟件包在Angular 2上將會不會工作?我如何看?

例如,說我想導入這個包(https://github.com/pvorb/node-md5)。我知道有一個ts-md5包的角2做md5 - 我只是用這個包作爲例子。

我該如何得到這個工作?

我用它

npm install md5 --save 
npm install @types/md5 --save 

,但我似乎不能成爲進口安裝了它

import {md5} from 'md5'; 

後,我嘗試運行

我收到此錯誤信息模塊 '「/ Users/xxx/Source/tempProjects/ngUnderscore/node_modules/@ types/md5/index」' 解析爲非mod這個實體並且不能使用這個 結構導入。

我不確定此消息的含義。這是否意味着在當前狀態下,軟件包不兼容或者我試圖錯誤地使用軟件包?

+0

http://stackoverflow.com/questions/41251101/import-from-installed-types –

+0

@suraj - 是的,我嘗試了所有對這個問題進行這些方法和他們都不工作 – Diskdrive

回答

1

他們通常會說它指的是哪個Angular,有時候你有兩個或每個包。

如果您使用的是Angular 1x軟件包並且沒有Angular2兼容性,那麼您可以使用ngUpgrade

但是,如果你使用的是一個普通的插件,那麼必須有一個角度2的解決方案。

如果你想要另一種方式,那麼你可能會錯誤的方式。

6

我設法使它工作使用聲明和要求,而不是進口(進口不會爲這種非模塊LIB工作)

declare const require: any; 
const md5 = require('md5'); 

如果你不想要解決進口這樣,你可以嘗試使用名爲ts-md5的Typescript MD5實現。然後導入像下面的應該工作。 (從this question參考)

import { Md5 } from 'ts-md5/dist/md5' 

如果沒有TS實現,你可以搜索DefinitelyTyped的類型,然後簡單地通過npm i --save-dev @types/{package-name}

+0

感謝您的工作。我想我一般都在尋找更多答案。有很多NPM庫 - 其中一些沒有被主動維護,其中一些沒有TS聲明文件,其中一些不是模塊化的 - 如果我想在一個有角度的項目中使用它,那麼標準的方式是什麼爲了讓我在Angular 2中工作?我可以總是使用declare const require:any方法嗎? – Diskdrive

+1

你可以使用任何JS庫/文件的聲明和需要的解決方法。也有不使用第三方JavaScript的方法。例如,您可以將其鏈接到index.html中,或使用webpack(或任何其他構建工具)將其包含在一個包中。然後你只需要聲明使用的lib /模塊或者創建一個自定義類型來阻止編譯器拋出錯誤。 – Vojtech

2

如果你的項目庫中的作品取決於許多安裝包因素:你的Angular版本,你的TypeScript版本等

這就是說,很明顯我們應該檢查庫的文檔,看看哪些依賴項有它的版本,當然庫應該是Angular 2版本本身。按照你的例子,有幾個md5庫,但是如果你使用TypeScript,你應該考慮這個:https://www.npmjs.com/package/ts-md5

如果我們已經涵蓋了所有內容,但仍然有些東西因爲某種類型的不兼容而不起作用,例如:

我的角度版本是2,我剛剛安裝的庫適用於Angular 4.我的代碼充滿<template>,庫使用<ng-template> ...我該怎麼辦?

你可以在github中分發庫並修改你需要的任何東西以確保它與你的項目兼容。步驟:

  1. 叉庫的儲存庫,並修改你需要什麼
  2. 訂閱主庫的儲存庫,以便與變化進行更新
  3. packages.json使用的庫您的分叉版本,例如:

"ng2-datetime": "https://github.com/my_user/ng2-datetime/tarball/my_forked_version_name",

  • 如果你認爲你的修改,可能會滿足其他用戶...提出拉請求! :D
  • 2

    這是更多的TypeScript問題,因爲md5不是Angular包。 關鍵是要使導入正確等同於require()函數。

    import * as md5 from "md5"; 
    

    直接使用在打字稿文件:

    console.log(md5('message')); 
    

    要在模板中使用,但最好應在方法實現中使用,但也可以直接暴露。添加它作爲組件的屬性:

    md5: any = md5; 
    

    然後在模板:

    {{md5('message')}} 
    
    +0

    可能值得注意的是,使用'from'模塊的import * as ns來得到CommonJS模塊的'module.exports'值是一種非標準的,TypeScript特有的方法,它不能在NodeJS的ES中使用模塊互操作。 –

    0

    您遇到的問題是不相關的角。導入CommonJS包時,它是TypeScript上的一個現有問題。

    經驗法則(我的建議)是在導入CommonJS時使用互操作功能(即import * as X from 'x'),而不是使用「舊」語法(即import X = require('x'))。

    當CommonJS以module.exports = function() {...}的形式輸出函數時,import * as X from 'x'不起作用。

    這包括包導出ES6類但通過Babel轉儲到ES5的情況。

    您可能會看到一些包做這個語法的工作,但是這是因爲分型有它的一個黑客:

    declare module 'x' { 
        function foo(): void 
        namespace foo {} // <-- the hack 
        exports = foo 
    } 
    

    還有其他原因的互操作是不是一個好主意,包括它們之間的語法TypeScript(import * X from 'x')和Babel(import X from 'x')不同意。

    您可以瞭解更多關於它在這裏,並按照鏈接: https://github.com/unional/typescript-guidelines/blob/master/pages/default/modules.md#import-keyword

    UPDATE:與[email protected]發佈,您現在可以直接做import EditableElement from 'Transformer'

    打開esModuleInteroptsconfig.json