【问题标题】:Where do we put node modules we install by npm in a Meteor project?在 Meteor 项目中,我们将通过 npm 安装的节点模块放在哪里?
【发布时间】:2012-05-22 05:03:44
【问题描述】:

我按照 github meteorirc 项目的引导,把它们放在 /public/ 中

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

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

Meteor 会收集您的所有 JavaScript 文件,不包括 client 和 public 子目录,并将它们加载到 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或其他地方部署时工作?

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

    要在 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")
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        不过我使用了一个小助手,因为我认为这不会是我将使用的最后一个 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"
        

        【讨论】:

        • 注意:自 Meteor 0.6.0 起,__meteor_bootstrap__.require 已被Npm.require() 淘汰
        【解决方案4】:

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

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

        这是我在 coffeescript 中的工作示例,node_modules 位于 public 文件夹中:

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

        祝你好运!

        【讨论】:

        • 注意:从 Meteor 0.6.0 开始,__meteor_bootstrap__.require 已被Npm.require() 淘汰
        【解决方案5】:
        cd /usr/local/meteor/lib/ && npm install <module>
        

        【讨论】:

        • 请注意,如果您使用此解决方案,通过部署功能部署到meteor.com,节点模块将不会部署。该解决方案适用于本地开发或在您自己的 Meteor 部署(如 AWS 等)上安装节点模块。如果您要部署到meteor.com,请使用(此解决方案)。[stackoverflow.com/questions/10476170/…
        • 一个关于 /usr/local 与 /usr/lib 的后续问题已发布:Should I install npm modules for Meteor in /usr/lib or /usr/local?
        • 这在 MacOS X 10.9.1 和最新的流星 ( 0.7.0.1 ) 中不起作用......无论我在哪里安装它,仍然找不到 SOAP 模块。试过app目录(导致错误),试过上面推荐的,也试过用-g安装模块..都无济于事。
        【解决方案6】:

        Meteor 从开发包中获取lib/node_modules 并创建一个符号链接或将其复制到server/node_modules,它位于您项目下隐藏的.meteor 子文件夹中。

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

        【讨论】:

        • 是的,该链接是我的主题。我担心的是,如果您将它们放在 /public/node_modules/ 中,您实际上可以从 Web 浏览器遍历目录结构。这会导致安全问题。当我通过 npm 在 /server/ node_modules 区域安装节点模块时,它们没有被部署。
        猜你喜欢
        • 2019-10-21
        • 2021-02-20
        • 2013-03-10
        • 1970-01-01
        • 2012-04-27
        • 2015-10-12
        • 2023-04-01
        • 2012-10-29
        • 2022-01-03
        相关资源
        最近更新 更多