【问题标题】:How do I properly alias a module in RequireJS on Node.js如何在 Node.js 上的 RequireJS 中正确地为模块起别名
【发布时间】:2013-10-29 04:28:11
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: javascript node.js requirejs


【解决方案1】:

我自己对此有点挣扎,但实际上能够使用 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,jsbuild/init.js 的符号链接,并且可以执行chmod a+x build/server.js

我没有使用 amdefine 加载器,它在没有使用插件的能力的情况下相当缺乏,而是使用带有 NodeJS 的完整 requirejs 模块,然后我的所有模块都可以全局使用 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);
    };
})();

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

编辑:一个较小的例子来自 RequireJS 创建者 James Burke:
https://groups.google.com/forum/#!msg/requirejs/ur_UQLr04rc/sSpM8y87VNMJ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2013-09-24
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2012-10-07
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多