Где мы помещаем модули node, которые мы устанавливаем на npm в проекте Meteor?

Я следил за проектом проекта github meteorirc и помещал их в /public/

Я установил свои модули node через npm изнутри /public/, и поэтому у меня есть каталог /public/ node_modules/.

Я не думаю, что это "правильное" или "стандартное" место для них, потому что согласно документам Meteor...

Meteor собирает все ваши файлы JavaScript, за исключением клиентских и общедоступных подкаталогов и загружает их на сервер Node.js экземпляр внутри волокна

Код для загрузки находится в файлах dir и server сервера 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');
}

Основываясь на документах, это не стандарт, и я не думаю, что я должен делать это таким образом. Тем не менее, он работает как на моей платформе dev, так и в производстве при развертывании meteor.com.

Где в структуре каталогов проекта должны быть установлены модули node, чтобы они работали локально и после развертывания на meteor.com или в другом месте?

Ответ 1

cd /usr/local/meteor/lib/ && npm install <module>

Ответ 2

Чтобы использовать модули Npm в Meteor, добавьте модуль npm.

Сначала вам нужно добавить адаптер пакета npm, например meteorhacks:npm

meteor add meteorhacks:npm

Затем запустите приложение meteor, запустив meteor, вы увидите новый packages.json файл в своем проекте

Добавьте в модули, подобные этому (вам нужно явно указать версию)

{
    "request" : "2.53.0"
}

Затем вы можете использовать модули npm в своем приложении meteor, используйте Meteor.npmRequire вместо require

var request = Meteor.npmRequire("request")

Ответ 3

Meteor берет lib/node_modules из пакета разработки и создает символическую ссылку или копирует ее в server/node_modules, которая находится в скрытой подпапке .meteor в вашем проекте.

Итак, если вы входите в каталог lib пакета разработки или в каталог server папки .meteor (я считаю, что он находится в build); вы сможете использовать модули node. Если у вас возникли проблемы с их загрузкой, вы можете проверить этот вопрос.

Ответ 4

Вам нужно добавить папку bundle в путь:

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')

Удачи!

Ответ 5

Это очень помогло мне, включая пакет подсветки синтаксиса! Спасибо!

Я использую немного помощника, хотя, как я думаю, это будет не последний пакет 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"

Ответ 6

Я использую такой script, который прекрасно устанавливает все зависимости node.js. Он ведет себя аналогично официальной поддержке в ветке Meteor engine (он устанавливает зависимости во время выполнения), но он также поддерживает установку из хранилищ git и аналогичных свойств.