1

コードの再利用を支援するために、Node.js サーバーで RequireJS を使用しています。クライアントとサーバー間でモジュールを共有しているため、これらのモジュールをできるだけ一般的なものにしたいと考えています。

問題は、クライアント側とサーバー側の両方の実装を提供するサードパーティ ライブラリ (easeljs) があり、サーバー側の実装は npm によって「node-easel」として提供されることです。

これに対処することを期待していた方法は機能しません。次のように、サーバー側アプリケーションのパス構成を提供しました。

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

上記のコードは、最初node-easel.jsにルート ディレクトリを検索してから、ノードの にフォールバックしますがrequire('easeljs')、これは私が望んでいるものではありません。requireJS を にフォールバックさせたいrequire('node-easel')。これを達成するための最良の方法は何ですか?

4

1 に答える 1

2

私自身、これには少し苦労しましたが、実際には RequireJSmap構成と 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プラグインを使用する機能がないと不足しているローダーを使用する代わりに、requirejsNodeJS で完全なモジュールを使用すると、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

于 2013-10-28T20:20:39.170 に答える