requireJSを使用してフォルダ全体を「require」することは可能ですか?
たとえば、大量のビヘイビアーjsファイルを含むビヘイビアーフォルダーがあります。require(['behaviors / *']、function(){...});を簡単に使用できるようにしたいと思います。そのリストを最新の状態に保つ必要はなく、そのフォルダ内のすべてをロードします。圧縮して最適化すると、これらのファイルをすべてまとめることができますが、開発では、それらを個別に操作する方が簡単です。
requireJSを使用してフォルダ全体を「require」することは可能ですか?
たとえば、大量のビヘイビアーjsファイルを含むビヘイビアーフォルダーがあります。require(['behaviors / *']、function(){...});を簡単に使用できるようにしたいと思います。そのリストを最新の状態に保つ必要はなく、そのフォルダ内のすべてをロードします。圧縮して最適化すると、これらのファイルをすべてまとめることができますが、開発では、それらを個別に操作する方が簡単です。
ブラウザのjavascriptにはファイルシステムへのアクセス権がないため、ディレクトリでファイルをスキャンすることはできません。phpやrubyなどのスクリプト言語でアプリを構築している場合は、ディレクトリをスキャンしてファイル名をrequire()呼び出しに追加するスクリプトを作成できます。
このアプローチを推奨できるかどうかはわかりません。これを行うより明確な方法は、必要な機能を手動で「要求」/「エクスポート」することだと思います。例外は、エクスポートしたいファイルの「名前空間」がある場合です。以下の「Babel および ES6 モジュールのインポート宣言 (export-namespace-from)」または「Babel および ES6 モジュールのインポート宣言」を参照してください。
これらのソリューションは、意味のあるファイル構造があることも前提としています。つまり、ファイル名はその「必要な」*
定義の一部になります。
ただし、それでもこれを行う必要がある場合は、探している動作を提供する既存のツールとメソッドがいくつかあります。
可能な解決策
Babel および ES6 モジュールのインポート宣言 (plugin-export-namespace-from)
.babelrc
を含めるようにファイルを更新する必要があります。共通/index.js
export * from './common/a'; // export const a = false;
export * from './common/b'; // export const b = true;
main.js
import { a, b } from './common';
console.log(a); // false
console.log(b); // true
Babel および ES6 モジュールのインポート宣言 (plugin-wildcard)
.babelrc
を含めるようにファイルを更新する必要があります。main.js
import { a, b } from './common/*'; // imports './common/a.js' and './common/b.js'
console.log(a); // false
console.log(b); // true
RequireJS (現在は古い)
require-wild
npm install require-wild
grunt.initConfig({
requireWild: {
app: {
// Input files to look for wildcards (require|define)
src: ["./**/*.js"],
// Output file contains generated namespace modules
dest: "./namespaces.js",
// Load your require config file used to find baseUrl - optional
options: { requireConfigFile: "./main.js" }
}
}
});
grunt.loadNpmTasks("require-wild");
grunt.registerTask('default', ['requireWild']);
namespaces.js
require(['namespaces'], function () { ... });
src
依存関係 glob パターン マッチングを使用できるようになりました。require(['behaviors/**/*'], function (behaviors) { }
これは古いことは知っていますが、私の解決策を共有したいと思います:
このソリューションには、JQuery が必要です
1) 「MyDirectory/」内のすべての js ファイルを一覧表示するbash スクリプトを作成し、 「directoryContents.txt」に保存します。
#!/bin/bash
#Find all the files in that directory...
for file in $( find MyDirectory/ -type f -name "*.js" )
do
fileClean=${file%.js} #Must remove .js from the end!
echo -n "$fileClean " >> MyDirectory/directoryContents.txt
done
MyDirectory/FirstJavascriptFile MyDirectory/SecondJavascriptFile MyDirectory/ThirdJavascriptFile
2) 次に、クライアント側の JS コードで:
.
$.get( "MyDirectory/directoryContents.txt", {}, function( data ) {
var allJsFilesInFolder = data.split(" ");
for(var a=0; a<allJsFilesInFolder.length; a++)
{
require([allJsFilesInFolder[a]], function(jsConfig)
{
//Done loading this one file
});
}
}, "text");
このコードが他のコードの前に終了しないという問題があったため、これが私の拡張された回答です。
define([''], function() {
return {
createTestMenu: function()
{
this.loadAllJSFiles(function(){
//Here ALL those files you need are loaded!
});
},
loadAllJSFiles: function(callback)
{
$.get( "MyDirectory/directoryContents.txt", {}, function( data ) {
var allJsFilesInFolder = data.split(" ");
var currentFileNum = 0;
for(var a=0; a<allJsFilesInFolder.length; a++)
{
require([allJsFilesInFolder[a]], function(jsConfig)
{
currentFileNum++;
//If it's the last file that needs to be loaded, run the callback.
if (currentFileNum==allJsFilesInFolder.length)
{
console.log("Done loading all configuration files.");
if (typeof callback != "undefined"){callback();}
}
});
}
}, "text");
}
}
});
私が最終的に行ったことは、Node サーバーが起動するたびに bash スクリプトを実行し、directoryContents.txt にデータを入力することでした。次に、私のクライアント側は、ファイルのリストの directoryContents.txt を読み取るだけで、そのリストにそれぞれが必要です。
お役に立てれば!
これを概念的にその場で行う方法は実際にはありません(私が知っていることです)。
ただし、いくつかの回避策があります。
使用grunt
してconcat
、その巨獣を必要とするだけです...私は知っています、ちょっと嫌です。
私が思うより良い解決策は...次のように必要な階層を使用します。
require('/js/controllers/init', function(ctrls){
ctrls(app, globals);
});
// /js/controllers/init.js
define('js/controllers/index', 'js/controllers/posts', function(index, posts){
return function protagonist(app, globals){
var indexModule = index(app, globals);
var indexModule = posts(app, globals);
return app || someModule;
};
});
// /js/controllers/index.js
define('js/controllers/index', 'js/controllers/posts', function(index, posts){
return function protagonist(app, globals){
function method1(){}
function method2(){}
return {
m1: method1,
m2: method2
};
};
});
protagonist
「 」に注意してくださいfunction
。これにより、使用前にモジュールを初期化できるため、' sandbox
' -- この場合はapp
とglobals
.
現実的には、あなたは持っていない/js/controllers/index.js
でしょう...おそらく、 「index」と呼ばれる(の兄弟)に隣接するディレクトリがあるよう/js/controllers/index/main.js
なものであるはずです。これにより、モジュールを特定のインターフェイスに拡張できるようになります。モジュールを簡単に交換して、インターフェイスを同じに保つことができます。/js/controllers/index/init.js
/js/controllers/init.js
お役に立てれば!ハッピーコーディング!