2016-04-28 6 views
0

私はモジュールを読み込むためにRequireJSを使用しているTypescriptsアプリケーションを作成しています(私はVisual Studio 2015を使用しています)。プラグインの読み込み時にTypescript + RequireJSコンパイラエラーが発生しました

ほとんどすべてのモジュールを.tsクラスから簡単に読み込むことができます。私は自分の書き込み型の.d.tsファイルを使って外部ライブラリから自分自身を書きました。

しかし、私の問題はjquery用のプラグインをロードしたいところから始まります。

私はライブラリ用の型指定ファイルを使用していますが、jquery用のプラグインであるため、論理的に.d.tsファイルにモジュール定義はありません。

私はこのようなRequireJS websiteからシムライブラリのロードのための勧告に従っている:

requirejs.config({ 
baseUrl: "Scripts", 
paths: { 
    "jquery": "jquery-2.2.3", 
    "jquery.pjax": "jquery.pjax" 
}, 
shim: 
{ 
    "jquery.pjax": 
    { 
     deps: ["jquery"], 
     exports: "jQuery.fn.pjax" 
    } 
} 
}); 
require(["app"]); 

そしてRequireJS websiteに従って:

シムの設定は、コードのみの関係を設定します。 shim configの一部であるモジュールをロードするには、通常のrequire/defineコールが必要です。 shimを単独で設定しても、ロードするコードは起動しません。今

、(でもjquery.pjax.jsの隣jquery.pjax.dtを移動した後に)プラグインをロードするため、次の作業のいずれ:

import * as pjax from "jquery.pjax"; 

import pjax = require("jquery.pjax"); 

import pjax = require("./jquery.pjax"); 

import pjax = require("jquery.pjax.js"); 

import pjax = require("./jquery.pjax.js"); 

コンパイラはエラーで文句Cannot find module "jquery.pjax"またはFile C:/foo/bar/jquery.pjax.d.ts is not a module

上記のいずれかのコードが存在する限り、app.tsはコンパイルされず、削除するとプラグインはロードされません。私は私のapp.tsファイル内のいくつかの輸入を使用していますし、より多くのがあるだろうということに関しては

は、私は、AMDが手動で関数を定義する書き込みに反対してimport Foo = require("foo")またはimport * as Foo from "foo"モジュールのロードスタイルを使用することを好みます。

また、Nugetパッケージ管理を使用しています。外部の.d.tsファイルまたは.jsファイルを手動で編集/移動しない方がよいです。

誰でも私にこれを理解してもらえますか?あなたがrequire("jquery.pjax")を呼び出すことができるようにしたい場合は

答えて

1

その名前で定義され、発見できる本当の活字体モジュールが必要である、あるいはどこかの宣言がある必要があるのいずれか:declare module "jquery.pjax"

私はあなたのオプションがあると思う:完全RequireJ外

  • ロードjQueryの(例えば、あなたのページにプレーンスクリプトタグでjQueryとjQuery.pjaxの両方を含み、そしてちょうど世界的にそれらを使用します)。 jQuery.pjaxは実際にRequireJSモジュールではありません(あなたのシム設定を使用する必要があるのはなぜですか?)
  • モジュールを追加してください宣言をコードベースに組み込み、実際のRequireJSモジュールであることをTypeScriptに説得します。これは、jquery.pjaxの既存の.d.ts定義内にあるか、別のファイルにスタンドアロンであれば簡単です。これを要求することができます。あなたがそれを必要とし、それを参照しないならば、TypeScriptは依存関係を実際に出力しないので、あなたはそれを偽の参照にする必要があることに注意してください。
  • TypeScriptのモジュールシステムの外側でRequireJSを手動でロードします。このようなプラグインエコシステムの場合、私は通常、実際のライブラリにRequireJSパスに 'raw-libraryname'という名前を付けてから、生のライブラリとプラグインを取得する新しい 'libraryname.ts'を自分で作成します。結果を返します(他のすべての人が正常に依存できる)。例:

    // Require config: 
    requirejs.config({ 
        baseUrl: "Scripts", 
        paths: { 
         "raw-jquery": "jquery-2.2.3", // only plugins depend on this 
         "jquery.pjax": "jquery.pjax", 
         "jquery": "lib-wrappers/jquery" // everything else uses this which 
                 // includes all your plugins 
        }, 
        shim: 
        { 
         "jquery.pjax": 
         { 
          deps: ["raw-jquery"] 
          // I don't think you need an exports here. 
          // Anybody who wants this should be using it from jQuery. 
         } 
        } 
    }); 
    
    
    
    // in lib-wrappers/jquery.ts 
    define(["raw-jquery", "jquery.pjax"], function ($) { 
        // RequireJS guarantees that this line is run before anything that 
        // depends on jQuery, and after both jQuery & any plugins above are loaded 
        return $; 
    }); 
    

    まだ彼らはjQueryのからそれを使用しようとする前に、非requirejsモジュール(jquery.pjax)が準備され、ロードされることを保証しながらこれは、他のすべてが正常としてRequireJS経由のjQueryを使用し続けることができることを保証します。

+0

これは非常に包括的な答えです。今すぐ回答を確認してください。ありがとう。 :) –

+0

私はdefinitelytypedを使ってこれと似たような答えを出しました。これはhttp://stackoverflow.com/questions/21179144/how-do-you-setup-a-require-js-config-with-typescript/42955298#42955298です。Timは右! – zobidafly