2013年流星NPM包

时间:2013-03-23 04:43:03

标签: node.js meteor npm

更新 this solution介绍了如何在Meteor中有效使用新的Npm系统。


目前在Meteor中使用NPM包的方法是什么?

截至2013年3月22日,没有关于此的官方文档。

有几个问题,特别是this one,但解决方案似乎已经过时了:引擎分支已不存在,而且我无法在Meteor中的Npm.require找到任何内容。

另一个解决方案posted here指示安装到.meteor/构建文件夹中。当我安装到Heroku时,这似乎不是一个有效的解决方案,因为buildpack在运行之前使用meteor bundle捆绑程序。因此,临时构建文件夹似乎不是一个有效的选项。

流星中的Npm发生了什么?什么是使用Npm包的最新方式?

在相关的说明中,我正在尝试使用亚马逊SDK(针对s3) - 将其打包为陨石包会更好吗?

5 个答案:

答案 0 :(得分:22)

Arunoda拥有created an NPM Atmosphere package,允许您像以前一样使用任何NPM模块。这很简单。

首先,mrt add npm

您也可以使用meteor-npm中的npm install -g meteor-npm命令安装软件包。

接下来,在根项目目录中创建一个packages.json文件,其中包含软件包名称和版本:

{
    "foobar": "0.3.5",
    "loremipsum": "2.1.4"
}

最后,将它们与Meteor.require一起使用,如下所示:var FooBar = Meteor.require('foobar');

答案 1 :(得分:9)

目前在Meteor中使用NPM的方法

  1. 将NP替换为NPM名称
  2. 将下面的文件大纲放在/ meteor-project-root / packages / x /
  3. meteor add x
  4. 要使用它,只需在代码中调用X(X.function())
  5. x.js --------

    X = Npm.require('x');
    

    package.js --------

    Package.describe({
      summary: "Meteor smart package for x node.js package"
    });
    
    Npm.depends({
      "x": "0.1.1"
    });
    
    Package.on_use(function (api) {
      api.add_files("x.js", ["client", "server"]);
    });
    

    注意:某些软件包只能在客户端或服务器上运行,如果遇到问题,请尝试仅包含您要使用它的一方。

答案 2 :(得分:3)

我一直在使用梦幻般的“browserify”,它就像一个魅力。这是使用Arunda's NPM Atmosphere packageusing Npm.require with package.js的替代方案,可以说有一些优势:

  1. 我的代码可以使用普通的旧“require”而不是Npm.require或Meteor.require。显然这不是一个大问题,但如果我想在Meteor之外使用这个代码,那么感觉它不依赖于Meteor很好。
  2. 我不必担心Meteor是否会再次改变它对Npm整合的看法。
  3. 它允许我使用npm link。
  4. 使用我自己的npm模块的本地开发版本

    以下是它的工作原理:

    1. 我在隐藏的.npm文件夹中为npm依赖项创建了一个单独的项目
    2. 我使用browserify创建将由meteor加载的bundle.js
    3. 我使用grunt watch来确保每次安装新的npm包时,都会更新bundle.js
    4. 这是我的目录结构:

      my_meteor_project/
          lib/
              bundle.js
      
          .npm/
              node_modules
              README.md
              Gruntfile.js
              entrypoint.js
              package.json
      

      这是一个entrypoint.js的例子(遗憾的是我必须使用全局变量,以便断言,url和_在Meteor代码中可用)

      assert = require('assert');
      url = require("url");
      _ = require('underscore');
      

      这是gruntfile:

      module.exports = function(grunt) {
        grunt.initConfig({
          watch: {
            build: {
                files: ['./entrypoint.js', './package.json'],
                tasks: ['browserify2'],
                options: {
                }
            }
          },
          browserify2: {
            compile: {
              entry: './entrypoint.js',
              compile: '../lib/bundle.js'
            }
          },
        });
      
        grunt.loadNpmTasks('grunt-browserify2');
        grunt.loadNpmTasks('grunt-contrib-watch');
        grunt.registerTask('build', ['browserify2']);
      };
      

      然后我使用grunt watch来监视对entry.js或新NP​​M安装的更改

      $ cd .npm
      $ grunt watch:build &
      [2] 44617
      $ Running "watch:build" (watch) task
      Waiting...
      

      然后,如果我安装了一个npm模块,或者修改了entrypoint.js,就会更新bundle.js:

      $ npm install url -save
      npm http GET https://registry.npmjs.org/punycode
      npm http GET https://registry.npmjs.org/querystring
      npm http 304 https://registry.npmjs.org/punycode
      npm http 304 https://registry.npmjs.org/querystring
      url@0.7.9 node_modules/url
      ├── querystring@0.1.0
      └── punycode@1.0.0
      $ OK
      >> File "package.json" changed.
      
      Running "browserify2:compile" (browserify2) task
      File written to: ../lib/bundle.js
      
      Done, without errors.
      Completed in 1.256s at Thu Jul 11 2013 11:36:22 GMT-0600 (MDT) - Waiting...
      

答案 3 :(得分:1)

您可以使用https://atmospherejs.com/meteorhacks/npm

meteor add meteorhacks:npm

然后你可以设置你的package.json文件:

{
  "redis": "0.8.2",
  "github": "0.1.8"
}

并使用这些包:

var GithubApi = Meteor.npmRequire('github');

答案 4 :(得分:-1)

当您使用陨石时,将节点模块安装到实际安装到.meteor/local/build/server/的{​​{1}}

~/.meteorite/meteors/meteor/meteor/f07715dc70de16a7aab84e56ab0c6cbd9c1f9dc6/dev_bundle/lib/node_modules

当您使用mrt bundle创建部署捆绑包时,其他捆绑包也会捆绑在一起。

我没有在Heroku上尝试过,但我检查过使用mrt bundle时节点模块是否打包了。