Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js上的RequireJS中正确地为模块添加别名_Javascript_Node.js_Requirejs - Fatal编程技术网

Javascript 如何在Node.js上的RequireJS中正确地为模块添加别名

Javascript 如何在Node.js上的RequireJS中正确地为模块添加别名,javascript,node.js,requirejs,Javascript,Node.js,Requirejs,我在Node.js服务器上使用RequireJS来帮助代码重用。我在客户机和服务器之间共享模块,因此我希望这些模块尽可能通用 问题是我有一个第三方库(easeljs),它同时提供客户端和服务器端实现,而npm提供的服务器端实现是“node-easel” 我所期望的处理方法行不通。我为服务器端应用程序提供了路径配置,如下所示: requirejs.config({ nodeRequire: require, paths: { 'easeljs': 'node-ea

我在Node.js服务器上使用RequireJS来帮助代码重用。我在客户机和服务器之间共享模块,因此我希望这些模块尽可能通用

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

我所期望的处理方法行不通。我为服务器端应用程序提供了路径配置,如下所示:

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

上面的代码将首先在根目录中查找
节点easel.js
,然后返回到节点的
require('easeljs')
,这不是我想要的。我希望requireJS回到
require('node-easel')
。实现这一点的最佳方法是什么?

我自己也为此做了一些努力,但实际上能够结合使用RequireJS
map
配置和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,js
是指向
build/init.js
的符号链接,并且是可执行的
chmod a+x build/server.js

我没有使用
amdefine
加载程序,因为它缺乏使用插件的能力,我将完整的
requirejs
模块与NodeJS一起使用,然后我只需要将
define
全局用于我的所有模块,如下面的代码所示

然后
src/init.js
(或在构建之后-
build/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);
    };
})();
#/usr/bin/env节点
/**
*@文件AMD加载程序模块配置。
*@author runelabs
*@version$Id$
*@说明
*
*模块“初始化”概述:
*这定义了init RequireJS配置模块,
*与其他使用AMD define()模式的模块不同。
*
*/
/*全局require,define,global*///使用JShint linter
(功能(){
"严格使用",;
var requirejs,摩卡,mainProg;
global.requirejs=global.define=requirejs=require('requirejs');
mainProg=['main'];
变量配置={
部门:主要项目,
路径:{
lib:'lib/',
测试:“../tests”,
应用程序:'.'',
config:'models/config',
软件包:“软件包”,
记录器:“程序包/记录器/记录器”,
pkg:'helpers/requirejs/pkgloader',
npm:'helpers/requirejs/npmloader',
text:'lib/requirejs text/text'
/*…更多路径*/
},
地图:{
'*': {
木偶:“npm!脊梁,木偶”,
达斯特:“npm!达斯特JS linkedin”
}
}
};
requirejs.config(config);
requirejs.onError=函数(err,u,l){
var LOG=需要('./包/记录器/记录器');
LOG.error('RequireJS error:',err.requireType);
LOG.error('mod:',err.requireModules);
LOG.error('map:',err.requireMap);
如果(err.requireType=='timeout'){
LOG.error('modules:',err.requiremoules);
}
LOG.error('ERR:',ERR);
LOG.error('errerror:',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('错误行:',错误行号);
LOG.error('ERR col:',ERR.columnNumber);
LOG.error('ERR stack:',ERR.stack);
抛出(错误);
};
})();
希望这能帮助其他希望使用RequireJS从
node\u模块
加载内容的人

编辑:一个较小的例子来自RequireJS的创建者詹姆斯·伯克:

也许映射配置比路径更有效-不,不幸的是,这将产生完全相同的结果。