21

更新 这个解决方案描述了如何在 Meteor 中有效地使用新的 Npm 系统。


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

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

关于这个有几个问题,特别是这个Npm.require,但是解决方案似乎已经过时了:引擎分支不再存在,而且我在 Meteor中找不到任何东西。

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

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

在相关说明中,我正在尝试使用 Amazon SDK(用于 s3) - 将其打包为 Meteorite 包会更好吗?

4

5 回答 5

22

Arunoda创建了一个 NPM Atmosphere 包,允许您像以前一样使用任何 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');

于 2013-06-18T22:26:27.770 回答
9

目前在 Meteor 中使用 NPM 的方式

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

x.js --------

X = Npm.require('x');

包.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"]);
});

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

于 2013-05-30T06:07:09.140 回答
3

我一直在使用神奇的“ browserify ”,它就像一个魅力。这是使用 Arunda的 NPM Atmosphere package将 Npm.require 与 package.js一起使用的替代方案,可以说具有一些优势:

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

以下是它的工作原理:

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

这是我的目录结构:

my_meteor_project/
    lib/
        bundle.js

    .npm/
        node_modules
        README.md
        Gruntfile.js
        entrypoint.js
        package.json

这是 entrypoint.js 的示例(不幸的是,我必须使用全局变量,以便在 Meteor 代码中使用 assert、url 和 _)

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

这是 grunt 文件:

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 的变化或新的 NPM 安装

$ 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...
于 2013-07-11T17:48:56.907 回答
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');
于 2015-07-09T07:24:00.423 回答
-1

当您使用陨石时,当您安装节点模块时,.meteor/local/build/server/您实际安装到

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

当您用于mrt bundle创建部署包时,其他包也会被捆绑。

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

于 2013-03-24T19:16:49.297 回答