2013 Meteor NPM 包

Posted

技术标签:

【中文标题】2013 Meteor NPM 包【英文标题】:2013 Meteor NPM Packages 【发布时间】:2013-03-13 01:59:02 【问题描述】:

更新this solution 描述了如何在 Meteor 中有效地使用新的 Npm 系统。


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

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

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

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

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

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

【问题讨论】:

这对你来说可能是完美的:youtube.com/watch?v=kA-QB9rQCq8&feature=youtu.be 如果你正在使用陨石,它已经在流星的开发分支上,你可以使用它,它会在流星的下一个版本中使用 顺便说一句,引擎分支和开发分支已在过去 2 周的某个时间合并 @Akshat 是否有稳定版本的 devel 可以正常工作? @Akshat 我发现了这个:github.com/possibilities/meteor-awssum - 现在应该做我需要做的事情 How do we or can we use node modules via npm with Meteor?的可能重复 【参考方案1】:

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

首先,mrt add npm

您也可以使用来自npm install -g meteor-npmmeteor-npm 命令安装该软件包。

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


    "foobar": "0.3.5",
    "loremipsum": "2.1.4"

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

【讨论】:

前几天看到这个,太棒了。 我花了很长时间才找到这个,但这种方法成功了......谢谢! Meteor.require 应该放在哪里?【参考方案2】:

目前在 Meteor 中使用 NPM 的方式

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

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

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

【讨论】:

/meteor-project-root/不需要放文件,Meteor会自动获取需要的包。 为了澄清,将步骤中列出的两个文件放置 啊,我明白了。问题是,如果您将其 github 发送给某人,它将无法正常工作(合作)。最好的办法是将其打包并发布到大气中,这既简单又快捷,并且您可以让整个社区都可以访问该包 如果它包含在 github 流星项目中并且有人克隆它以供本地使用,这肯定会正常工作。 Meteor 将自动获取包,因为它们将包含在 .meteor/packages 我的错,我以为您的意思是在您的计算机上安装流星。部署呢?这也一样吗?【参考方案3】:

我一直在使用奇妙的“browserify”,它就像一个魅力。这是使用 Arunda's NPM Atmosphere package 或 using Npm.require with package.js 的替代方法,可以说具有一些优势:

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

它是这样工作的:

    我在隐藏的 .npm 文件夹中为 npm 依赖项创建了一个单独的项目 我使用 browserify 创建了一个 bundle.js 将被流星加载 我使用 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');

这是 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 的变化或新的 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...

【讨论】:

感谢您的信息。似乎有点复杂,但感谢您添加信息。我建议你在 Stack Overflow 上注册! 您好,我按照您的指示开始构建我的 bundle.js 文件。但是我很困惑,既然我在 lib 文件夹中有 bundle.js 文件,我该如何在我的流星项目中实际使用节点模块? 啊,我刚刚读到您必须将它们设为全局,别管我之前的问题。一切都很好!全局部分是唯一的缺点,但嘿,我会接受的。因此,使用 mrt add npm 我可以在后端使用 npm 包,使用 browserify(您的解决方案)我可以在前端使用 npm 包。这太棒了!谢谢!!!【参考方案4】:

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

meteor add meteorhacks:npm

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


  "redis": "0.8.2",
  "github": "0.1.8"

并使用这些包:

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

【讨论】:

我相信这对于服务器来说是一个很好的解决方案,但它不会让您访问客户端上的 npm 模块。【参考方案5】:

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

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

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

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

【讨论】:

以上是关于2013 Meteor NPM 包的主要内容,如果未能解决你的问题,请参考以下文章

meteor.js 和 npm 需要 fs

如何在 Meteor 中使用`moment.js`?

在 Meteor 1.0 中加载 NPM 包?

如何从 GitHub 为 Meteor 安装 NPM 包?

通过 cosmos:browserify 在 Meteor 中使用 npm 包

在 Meteor 包中使用 npm