2013-07-01 54 views
1

我在Node.js服務器上使用RequireJS來幫助重新使用代碼。我在客戶端和服務器之間共享模塊,因此我希望儘可能保持這些模塊的一般性。如何在Node.js的RequireJS上正確地使用別名模塊

問題是我有一個第三方庫(easeljs),它提供了一個客戶端和一個服務器端實現,npm提供的服務器端實現爲'node-easel'。

我期望處理這種方式不起作用。我公司提供如下一個路徑配置服務器端應用程序:

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

上面的代碼將首先查找node-easel.js在根目錄下,回落到節點的require('easeljs'),這不是我想要的東西了。我想要求JS回落到require('node-easel')。什麼是實現這一目標的最佳方式?

+0

也許地圖上的配置會比路徑更好 - http://requirejs.org/docs/api.html#config-map –

+0

不,不幸的是,它會得到完全相同的結果。 – joost

回答

2

我自己也有點掙扎,但實際上卻能夠使用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); 
    }; 
})(); 

希望這可以幫助其他人希望使用RequireJS從node_modules加載的東西。

編輯:較小的例子是RequireJS創作者詹姆斯·伯克:
https://groups.google.com/forum/#!msg/requirejs/ur_UQLr04rc/sSpM8y87VNMJ