Извиняюсь, если я пропустил это в документах. В основном я хочу использовать функцию конфигурации модуля 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 - конфигурацией, необходимой для загрузки модулей, - и конфигурацией модуля пользователя. Но я в настоящее время изо всех сил пытаюсь найти это :(

7
greTech 25 Янв 2013 в 13:09

4 ответа

Лучший ответ

Подумав немного об этом, я нашел обходной путь. Это не особенно красиво, но, похоже, работает.

Я просто дважды требую JS (...), сначала создать конфигурацию, а затем загрузить модули приложения с конфигурацией.

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
define ['module'], (module) ->
    # config is now available in this module
    console.log(module.config().key)
0
greTech 26 Янв 2013 в 16:24

Следуя тому, что говорит @jrburke, я нашел следующий шаблон весьма полезным: определить модуль конфигурации и его зависимости в main.js непосредственно перед вызовом require.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

0
f1lt3r 5 Дек 2015 в 17:26

Для такого решения я хотел бы, чтобы модуль зависел от модуля «config», который вы можете поменять на другой с помощью конфигурации путей. Так что, если «bar» нужен какой-то конфиг, «bar.js» будет выглядеть так:

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

Тогда barConfig.js может иметь другие зависимости:

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

Затем, если вам потребовались разные конфигурации для, скажем, production против dev, используйте конфигурацию путей для сопоставления barConfig с другими значениями:

requirejs.config({
  paths: {
    barConfig: 'barConfig-prod'
  }
});
6
jrburke 28 Янв 2013 в 21:42

Я думаю, что правильный способ сделать это, чтобы сделать модуль конфигурации ...

// 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(['config', 'main']);

Затем вы можете использовать его, не добавляя его к определению:

// bar.js
define([], function() {
    var key = config.key;
});
2
Felix 26 Янв 2013 в 12:38