未加星标

Configuring modules with RequireJS when config depends on RequireJS

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二05 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏

Apologies if I have missed this in the docs. Basically I want to use the RequireJS module configuration feature. I would like to centrally manage the config values given to modules in a package.

This is an example from the docs:

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; });

My problem is that my configuration info will be a little more complex, and will itself have dependencies. I would like to do:

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

Where variables in my config need to use requireJS to evaluate.

To me it would make sense for there to be a logical separation between the RequireJS configuration - the config necessary to load modules - and the user's module configuration. But I am currently struggling to find this :(

Problem courtesy of: greTech

Solution

Having thought about this a little more I have come up with a workaround. It is not particularly pretty but it does seem to work.

I simply do requireJS(...) twice, first to create the config, and second to load the application modules with the config..

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()

And in bar.coffee

# bar.coffee define ['module'], (module) -> # config is now available in this module console.log(module.config().key)

Solution courtesy of: greTech

Discussion

I think the proper way to do this is to make a config module...

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

Then use it in other modules...

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

You can then make it as complicated as you like!

EDIT: You could pollute the global namespace for this special class...

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

Add it to the top level require call:

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

Then you can use it without always adding it to your define:

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

Discussion courtesy of: Felix

Riffing on what @jrburke is saying, I found the following pattern to be quite useful: define a config module and it's dependencies in the main.js just before the invocation of 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 Demo: http://plnkr.co/edit/I35bEgaazEAMD0u4cNuj

Discussion courtesy of: Alistair MacDonald

For this sort of solution, I would have the module depend on a "config" module that you can swap for a different one using paths config. So if "bar" needed some config, "bar.js" would look like:

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

Then barConfig.js could have your other dependencies:

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

Then, if you needed different configs for say, production vs. dev, use paths config to map barConfig to other values:

requirejs.config({ paths: { barConfig: 'barConfig-prod' } });

Discussion courtesy of: jrburke

This recipe can be found in it's original form on Stack Over Flow .

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

分页:12
转载请注明
本文标题:Configuring modules with RequireJS when config depends on RequireJS
本站链接:https://www.codesec.net/view/611864.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(10)