web-dev-qa-db-ja.com

requireJSが.jsファイル拡張子を自動的に追加しないようにすることは可能ですか?

RequireJSを使用してスクリプトをロードしています。 ドキュメントのこの詳細

パスマッピングはディレクトリ用である可能性があるため、モジュール名に使用されるパスには.​​js拡張子を含めないでください。

私のアプリでは、すべてのスクリプトファイルを実行時に動的に生成するため、すべてのスクリプトファイルを構成パスにマップします(スクリプトは_order.js_のようなものから始まりますが、_order.min.b25a571965d02d9c54871b7636ca1c5e.js_のようなものになります(これはキャッシュ無効化のためのファイルコンテンツのハッシュ)。

場合によっては、requireはこれらのパスの最後に2番目の.js拡張子を追加します。サーバー側で動的パスを生成し、構成パスを設定しますが、問題のあるファイルから_.js_拡張子を削除するために、追加のJavaScriptコードを記述する必要があります。

RequireJSのドキュメントを読んで、パスマッピングをディレクトリに使用したい理由が本当にわかりません。これは、1回の呼び出しでディレクトリ全体のファイルを何らかの方法で読み込むことができるということですか?わかりません。

ファイルパスへの.jsの追加を停止するだけで強制することが可能かどうかを誰かが知っているので、ハックする必要はありませんか?

ありがとう。

更新:要求に応じていくつかのコードサンプルを追加しました。

これは私のHTMLファイル内にあります(Scalaプロジェクトなので、これらの変数を_.js_ファイルに直接書き込むことはできません):

_foo.js.modules = {
    order               : '@Static("javascripts/order.min.js")',
    reqwest             : 'http://5.foo.appspot.com/js/libs/reqwest',
    bean                : 'http://4.foo.appspot.com/js/libs/bean.min',
    detect              : 'order!http://4.foo.appspot.com/js/detect/detect.js',
    images              : 'order!http://4.foo.appspot.com/js/detect/images.js',
    basicTemplate       : '@Static("javascripts/libs/basicTemplate.min.js")',
    trailExpander       : '@Static("javascripts/libs/trailExpander.min.js")',
    fetchDiscussion     : '@Static("javascripts/libs/fetchDiscussion.min.js")'
    mostPopular         : '@Static("javascripts/libs/mostPopular.min.js")'
};
_

それから私の_main.js_の中:

_requirejs.config({
    paths: foo.js.modules
});

require([foo.js.modules.detect, foo.js.modules.images, "bean"], 
    function(detect, images, bean) {
        // do stuff
});
_

上記の例では、直接オブジェクト(他のユーザーが_foo.js.modules.bar_を使用するように)ではなく、文字列 "bean"(必須パスを参照)を使用する必要があります。そうでない場合、追加の_.js_が追加されます。

これが理にかなっていることを願っています。

52
Matt Andrews

requirejs ' noextプラグイン

「.js」拡張子を追加せずにスクリプトをロードします。動的スクリプトに役立ちます...

ドキュメンテーション

examplesフォルダーを確認してください。おそらく必要な情報はすべて、コメント内またはサンプルコード自体にあります。

基本的な使い方

プラグインをbaseUrlフォルダー(通常はmain.jsファイルと同じフォルダー)に入れるか、プラグインの場所のエイリアスを作成します。

require.config({
    paths : {
        //create alias to plugins (not needed if plugins are on the baseUrl)
        async: 'lib/require/async',
        font: 'lib/require/font',
        goog: 'lib/require/goog',
        image: 'lib/require/image',
        json: 'lib/require/json',
        noext: 'lib/require/noext',
        mdown: 'lib/require/mdown',
        propertyParser : 'lib/require/propertyParser',
        markdownConverter : 'lib/Markdown.Converter'
    }
});

//use plugins as if they were at baseUrl
define([
        'image!awsum.jpg',
        'json!data/foo.json',
        'noext!js/bar.php',
        'mdown!data/lorem_ipsum.md',
        'async!http://maps.google.com/maps/api/js?sensor=false',
        'goog!visualization,1,packages:[corechart,geochart]',
        'goog!search,1',
        'font!google,families:[Tangerine,Cantarell]'
    ], function(awsum, foo, bar, loremIpsum){
        //all dependencies are loaded (including gmaps and other google apis)
    }
);
14
jaketrent

Noextに依存関係を追加したくない場合は、次のように、パスにダミーのクエリ文字列を追加して、.js拡張子が追加されないようにすることもできます。

require.config({
    paths: {
        'signalr-hubs': '/signalr/hubs?noext'
    }
});

これがnoextプラグインの機能です。

110
Chris Eldredge

Node.jsでrequirejsサーバー側を使用しています。 noextプラグインは機能しません。これは、URLに?noextを追加しようとし、サーバー側のURLの代わりにファイル名があるためだと思われます。

静的.jsファイルと区別するために、ファイルに.njsまたは.modelという名前を付ける必要があります。作者がrequirejsを更新して、ユーザーに自動.jsファイル拡張子規則を強制しないことを願っています。

その間、この動作を無効にするためのクイックパッチがあります。

このパッチを適用するには(node_modules/requirejs/bin/r.jsのバージョン2.1.15に対して):

  1. DisableAutoExt.diffなどのファイルに保存して、ターミナルを開きます
  2. cd path/to/node_modules /
  3. patch -p1 <path/to/disableAutoExt.diff
  4. disablejsExt.trueをrequirejs.configに追加:requirejs.config({disableAutoExt:true、});

これでrequire(["test/index.njs"、...] ...を実行して作業に戻ることができます。

DisableAutoExt.diffにこのパッチを保存します。

--- mod/node_modules/requirejs/bin/r.js 2014-09-07 20:54:07.000000000 -0400
+++ node_modules/requirejs/bin/r.js 2014-12-11 09:33:21.000000000 -0500
@@ -1884,6 +1884,10 @@
         //Delegates to req.load. Broken out as a separate function to
         //allow overriding in the optimizer.
         load: function (id, url) {
+            if (config.disableAutoExt && url.match(/\..*\.js$/)) {
+                url = url.replace(/\.js$/, '');
+            }
+
             req.load(context, id, url);
         },

パッチは、node_modules/requirejs/bin/r.jsに行1887の周りに以下を追加するだけです:

if (config.disableAutoExt && url.match(/\..*\.js$/)) {
    url = url.replace(/\.js$/, '');
}

更新:URLの変更をコード内でより深く移動することにより、モジュールでundefを呼び出した後にハングが発生しないようにパッチを改善しました。次の理由でundefが必要です。

Node.jsで開発するときにモジュールのキャッシュを無効にするには、これをメインアプリファイルに追加します。

requirejs.onResourceLoad = function(context, map)
{
    requirejs.undef(map.name);
};
0
hud