10

我跟随 github meteorirc 项目的领导并将它们放在 /public/

我通过 npm 从 /public/ 内部安装了我的节点模块,因此我有一个 /public/node_modules/ 目录。

我不认为这对他们来说是“适当”或“标准”的地方,因为根据 Meteor 文档...

Meteor 收集所有 JavaScript 文件,不包括客户端和公共子目录下的任何内容,并将它们加载到 Fiber 内的 Node.js 服务器实例中

要加载的代码位于服务器目录和服务器 js 文件中,如下所示。

var require = __meteor_bootstrap__.require;

var path = require("path");
var fs = require('fs');
var base = path.resolve('.');
if (base == '/'){
  base = path.dirname(global.require.main.filename);   
}

var Twit;
var twitPath = 'node_modules/twit';
var publicTwitPath = path.resolve(base+'/public/'+twitPath);
var staticTwitPath = path.resolve(base+'/static/'+twitPath);
if (path.existsSync(publicTwitPath)){
  Twit = require(publicTwitPath);
}
else if (path.existsSync(staticTwitPath)){
  Twit = require(staticTwitPath);
}
else{
  console.log('WARNING Twit not loaded. Node_modules not found');
}

根据文档,这不是标准的,我不相信我应该这样做。然而,它既适用于我的开发平台,也适用于 deploymeteor.com 的生产环境。

节点模块应该安装在项目目录结构的哪个位置,以便它们在本地工作以及在meteor.com 或其他地方部署时工作?

4

6 回答 6

6
cd /usr/local/meteor/lib/ && npm install <module>
于 2012-05-21T09:53:41.610 回答
2

要在 Meteor 中使用 Npm 模块,请在其中添加 npm 模块。

首先,您需要添加一个 npm 包适配器,例如meteorhacks:npm

meteor add meteorhacks:npm

然后通过运行启动你的流星应用程序meteor,你会注意到packages.json你的项目中有一个新文件

添加这样的模块(您需要明确定义一个版本)

{
    "request" : "2.53.0"
}

然后你可以在你的流星应用程序中使用 npm 模块,使用Meteor.npmRequire而不是require

var request = Meteor.npmRequire("request")
于 2015-02-09T13:22:41.427 回答
1

Meteorlib/node_modules从开发包中获取符号链接或将其复制到项目下server/node_modules的隐藏.meteor子文件夹中。

所以,如果你 cd 进入lib开发包的目录或server文件夹的.meteor目录(我相信它在build);您将能够使用节点模块。如果您在加载它们时遇到问题,您可能需要查看这个问题

于 2012-05-15T16:28:01.820 回答
1

您必须将捆绑文件夹添加到路径:

var staticTwitPath = path.resolve(base+'/bundle/static/'+twitPath);

这是我在 coffeescript 中的工作示例, node_modules公共文件中:

# loading node_modules from public folder
require = __meteor_bootstrap__.require
path    = require("path")
fs      = require('fs')

cheerioPath = 'node_modules/cheerio'

base = path.resolve('.')
if base == '/'
  base = path.dirname(global.require.main.filename)

publicPath = path.resolve(base+'/public/'+cheerioPath)
staticPath = path.resolve(base+'/bundle/static/'+cheerioPath)

if path.existsSync(publicPath)
  cheerio = require(publicPath)
else if path.existsSync(staticPath)
  cheerio = require(staticPath)
else
  console.log('node_modules not found')

祝你好运!

于 2012-08-28T11:47:54.323 回答
0

这对我有很大帮助,包括语法高亮包!谢谢!

不过我使用了一个小助手,因为我认为这不会是我将使用的最后一个 npm 包;)

meteorNpm = do() ->
  require = __meteor_bootstrap__.require

  path    = require 'path'
  fs      = require 'fs'

  base = path.resolve '.'
  if base is '/'
    base = path.dirname global.require.main.filename

  meteorNpm =
    # requires npm modules placed in `public/node_modules`
    require: (moduleName) ->
      modulePath = 'node_modules/' + moduleName

      publicPath = path.resolve(base + '/public/' + modulePath)
      staticPath = path.resolve(base + '/bundle/static/' + modulePath)

      if path.existsSync(publicPath)
        module = require publicPath
      else if path.existsSync(staticPath)
        module = require staticPath
      else
        module = null

      return module

像这样使用它:

highlight = meteorNpm.require "highlight.js"
于 2012-08-31T11:38:35.327 回答
0

我正在使用这样的脚本,它可以很好地安装所有 node.js 依赖项。它的行为类似于 Meteor 引擎分支中的官方支持(它在运行时安装依赖项),但它也支持从 git 存储库和类似的好东西安装。

于 2013-03-19T00:53:13.347 回答