如何在Node.js的RequireJS中正确地使用别名模块

我在我的Node.js服务器上使用RequireJS来帮助代码重用。 我在客户端和服务器之间共享模块,因此我想尽可能保持这些模块的一般性。

问题是我有一个第三方库(easeljs),它提供了一个客户端和一个服务器端的实现,npm提供的服务器端实现是“node-easel”。

我期望处理这个方法是行不通的。 我为服务器端应用程序提供了一个pathconfiguration,如下所示:

requirejs.config({ nodeRequire: require, paths: { 'easeljs': 'node-easel' } }) 

上面的代码首先会在根目录下查找node-easel.js ,然后再回到节点的require('easeljs') ,这不是我想要的。 我想要求js回落到require('node-easel') easel require('node-easel') 。 什么是最好的方法来完成这个?

我自己也挣扎了一下,但实际上却能够使用RequireJS mapconfiguration和NPM模块加载器的组合。 代码如下:

 requirejs.config({ paths: { npm: 'helpers/requirejs/npmloader' }, map: { '*': { dust: 'npm!dustjs-linkedin' } } }); 

然后对于helpers/requirejs/npmloader.js

 define({ normalize: function (name, normalize) { return name; }, load: function (name, req, onload, config) { require(name); } }); 

有了这个,你可以使用RequireJS轻松地将NodeJS模块别名。

package.json我也使用以下内容:

 "main": "./bin/server.js", "bin": { "server.js": "./bin/server.js" } 

使用顶层bin/server,jsbuild/init.js和可执行chmod a+x build/server.js的符号链接。

我没有使用amdefine加载器,而amdefine加载器没有插件的使用能力,所以我使用完整的requirejs模块和NodeJS,然后我define了全部的模块,就像你在下面的代码中看到的那样。

然后src/init.js (或者在build/init.jsbuild/init.js )包含下面这个可能是一个有用的例子:

 #!/usr/bin/env node /** * @file The AMD loader module configuration. * @author runelabs <http://github.com/runelabs> * @version $Id$ * @description * * MODULE 'init' OVERVIEW: * This defines the init RequireJS configuration module, * in contrast to other modules which are using the AMD define() pattern. * */ /*global require, define, global*/ // using JShint linter (function() { 'use strict'; var requirejs, mocha, mainProg; global.requirejs = global.define = requirejs = require('requirejs'); mainProg = ['main']; var config = { deps: mainProg, paths: { lib: 'lib/', tests: '../tests', app: '.', config: 'models/config', packages: 'packages', logger: 'packages/logger/logger', pkg: 'helpers/requirejs/pkgloader', npm: 'helpers/requirejs/npmloader', text: 'lib/requirejs-text/text' /* ... more paths */ }, map: { '*': { marionette:'npm!backbone.marionette', dust: 'npm!dustjs-linkedin' } } }; requirejs.config(config); requirejs.onError = function (err, u, l) { var LOG = require('./packages/logger/logger'); LOG.error('RequireJS error: ', err.requireType); LOG.error(' mod: ', err.requireModules); LOG.error(' map: ', err.requireMap); if (err.requireType === 'timeout') { LOG.error(' modules: ', err.requireModules); } LOG.error('ERR: ', err); LOG.error('ERR error: ', err.error); LOG.error('ERR type: ', typeof err); if (err['toSource']) { LOG.error('ERR src: ', err.toSource()); } LOG.error('ERR name: ', err.name); LOG.error('ERR message: ', err.message); LOG.error('ERR file: ', err.fileName); LOG.error('ERR line: ', err.lineNumber); LOG.error('ERR col: ', err.columnNumber); LOG.error('ERR stack: ', err.stack); throw(err); }; })(); 

希望这可以帮助其他人使用RequireJS从node_modules加载内容。

编辑:一个较小的例子是从RequireJS创build者詹姆斯·伯克在:
https://groups.google.com/forum/#!msg/requirejs/ur_UQLr04rc/sSpM8y87VNMJ