7

ドキュメントでこれを見逃していた場合はお詫び申し上げます。基本的には、RequireJS モジュール構成機能を使用したいと考えています。パッケージ内のモジュールに与えられた構成値を一元管理したいと考えています。

これはドキュメントの例です:

requirejs.config({
    config: {
        'bar': {
            size: 'large'
        },
        'baz': {
            color: 'blue'
        }
    }
});

//bar.js, which uses simplified CJS wrapping:
define(function (require, exports, module) {
    //Will be the value 'large'
    var size = module.config().size;
});

//baz.js which uses a dependency array,
define(['module'], function (module) {
    //Will be the value 'blue'
    var color = module.config().color;
});

私の問題は、構成情報がもう少し複雑になり、それ自体に依存関係があることです。私はやりたい:

requirejs.config({
    config: {
        'bar': {
            path: path.dirname(module.uri)
            key: crypto.randomBytes(64)
        },
    }
});

私の構成内の変数は、requireJS を使用して評価する必要があります。

私にとっては、RequireJS 構成 (モジュールをロードするために必要な構成) とユーザーのモジュール構成の間に論理的な分離があることは理にかなっています。しかし、私は現在これを見つけるのに苦労しています:(

4

4 に答える 4

6

この種のソリューションでは、パス構成を使用して別のモジュールと交換できる「構成」モジュールにモジュールを依存させます。したがって、「bar」に何らかの構成が必要な場合、「bar.js」は次のようになります。

define(['barConfig'], function (config) {
});

次に、barConfig.js に他の依存関係を含めることができます。

define(['crypto'], function (crypto) {
    return {
      key: crypto.randomBytes(64)
    }
});

次に、本番環境と開発環境で異なる構成が必要な場合は、パス構成を使用して barConfig を他の値にマップします。

requirejs.config({
  paths: {
    barConfig: 'barConfig-prod'
  }
});
于 2013-01-28T21:42:39.567 に答える
2

これを行う適切な方法は、構成モジュールを作成することだと思います...

// config.js
define(['module', 'path', 'crypto'], function(module, path, crypto) {
    return {
        path: path.dirname(module.uri)
        key: crypto.randomBytes(64)
    };
}); 

次に、他のモジュールで使用します...

// bar.js
define(['config'], function (config) {
    var key = config.key;
});

その後、好きなだけ複雑にすることができます!

編集:この特別なクラスのグローバル名前空間を汚染する可能性があります...

define(['module', 'path', 'crypto'], function(module, path, crypto) {
    window.config = {
        path: path.dirname(module.uri)
        key: crypto.randomBytes(64)
    };
}); 

最上位の require 呼び出しに追加します。

require(['config', 'main']);

次に、定義に常に追加せずに使用できます。

// bar.js
define([], function() {
    var key = config.key;
});
于 2013-01-26T08:33:12.863 に答える
0

@jrburke が言っていることを調べてみると、次のパターンが非常に便利であることがわかりました。構成モジュールを定義しmain.jsrequire.config().

main.js

define('config', ['crypto'], function (crypto) {
  return {
    'bar': {
      key: crypto.randomBytes(64)
    },
  };
});

requirejs.config({
  deps: ['app'],
});

app.js

require(['config'], function (config){

  // outputs value of: crypto.bar.key
  console.log(config.bar.key);
});

Plnkr デモ: http://plnkr.co/edit/I35bEgaazEAMD0u4cNuj

于 2015-12-05T17:26:46.143 に答える
0

これについてもう少し考えたところ、回避策を思いつきました。それは特にきれいではありませんが、うまくいくようです。

最初に構成を作成し、次に構成を使用してアプリケーション モジュールをロードするために、requireJS(...) を 2 回実行するだけです。

requireJSConfig = 
    baseUrl: __dirname
    nodeRequire: require

# Create the require function with basic config
requireJS = require('requirejs').config(requireJSConfig)  
requireJS ['module', 'node.extend', 'crypto', 'path'], (module, extend, crypto, path) ->
    # Application configuration 
    appConfig =
        'bar':
            path:   path.dirname(module.uri)
            key:    crypto.randomBytes(64) # for doing cookie encryption

    # get a new requireJS function with CONFIG data
    requireJS = require('requirejs').config(extend(requireJSConfig, config: appConfig))
    requireJS ['bar'], (app) ->
        ###
            Load and start the server
        ###
        appServer = new app()

        #  And start the app on that interface (and port).
        appServer.start()

そしてbar.coffeeで

# bar.coffee
define ['module'], (module) ->
    # config is now available in this module
    console.log(module.config().key)
于 2013-01-26T11:39:08.890 に答える