在Meteor包中使用npm

3

我正在尝试找出将npm软件包加载到Meteor应用中的方法,具体而言,我使用了future-npm

我已经尝试了以下方法:

Package.describe({
  summary: "Blah blah",
  version: '0.0.1'
});

Npm.depends({future: "2.3.1"});

Package.onUse(function (api) {
  api.addFiles('lubert.js', 'server');
  api.export('Lubert');
});

很抱歉,我遇到了以下控制台错误。
 Uncaught ReferenceError: Npm is not defined

我已经阅读了文档,但没有关于如何加载任何依赖项的内容。

我做错了什么?

更新2:我的package.js文件如下:

Package.describe({
  name: 'trepafi:package',
  summary: '',
  version: '0.0.3',
  git: 'https://github.com/trepafi/meteor-package.git'
});

Npm.depends({
  "future": "2.3.1"
});

Package.onUse(function(api) {
  api.versionsFrom('1.0');
  api.use(['tracker', 'underscore'], ['client']);
  api.addFiles(['package.js'], ['client']);
  api.export('Package', ['client']);
});

更新1: 我的package.json文件如下:
{
  "name": "trepafi-package",
  "version": "0.0.3",
  "description": "Package for Meteor",
  "repository": {
    "type": "git",
    "url": "https://github.com/trepafi/meteor-package.git"
  },
  "author": "Lubert Palacios",
  "license": "MIT",
  "homepage": "https://github.com/trepafi/meteor-package",
  "dependencies": {
    "future": "^2.3.1"
  }
}

我也尝试过使用meteorhacks:npm,但没有成功。 如果能使用“本地”的方法就太好了。


你的包文件结构是什么?你的语法看起来不错。 - saimeunt
1
@saimeunt 刚刚添加了它。 - Lt.
1
@Sindis 我已经尝试过了,但没有成功。 - Lt.
你不需要提供一个 package.json 文件,只需要在自己的包目录中提供一个 package.js 文件。 - saimeunt
@saimeunt,对不起,对我来说太晚了!我也刚刚添加了它。 - Lt.
显示剩余2条评论
1个回答

5

你应该将所有的Npm.require都放在package.js文件的末尾。

对于future-npm,你不需要在package.js中使用Npm.depends。这已经包含在Meteor中了。只需在某处使用Npm.require即可。操作步骤如下:

  1. 不要使用模糊的package.js名称。改为使用trepafi:package.js

  2. 你不需要package.json。因为Npm.depends已经覆盖了它。

  3. 删除这一行:api.addFiles(['package.js'], ['client']);,因为这看起来像一个循环依赖。这样做不好,Xzibit。

  4. 由于Npm.require仅适用于服务器端,所以你需要将trepafi:package.js作为服务器端引入。例如:

    api.addFiles(['trepafi:package.js'], ['server']);

因此,你的结构至少应该是这样的:

trepafi:package/
  - package.js
  - trepafi:package.js
  - <other files..>

对于Future,您不需要package.json..它已经包含在Meteor中。

您的package.js应该如下所示:

Package.describe({
  name: 'trepafi:package',
  summary: '',
  version: '0.0.3',
  git: 'https://github.com/trepafi/meteor-package.git'
});

Package.onUse(function(api) {
  api.versionsFrom('METEOR@1.0');
  api.use(['tracker', 'underscore','meteor'], ['client']);
  api.addFiles(['trepafi:package.js'], ['server']);
  api.export('Package', ['client']);
});

//if you really need Npm.depends:

Npm.depends({
   'prerender-node': '1.0.6',
   'send' : '0.10.1'
});

// we don't need no package.json

你的 trepafi:package.js 应该长这样:

var Future = Npm.require('future');
var future = new Future();

// use your future to make Doc Brown proud.

var useFuture = function(asyncFunc) { //expects function with callback somewhere
    asyncFunc(function(err, result) {
        if(err) future.throw("OMG something went wrong!");
        else return future.return(result);
    });
    return future.wait();
};

Meteor.startup(function() {
   //something      
});

阅读:

package.js中值得注意的更改是现在添加了versionsFromapi.use中添加了meteor

祝你好运!


谢谢。我一直在想为什么我的浏览器日志中会出现“Npm is missing”,它指的是./myPackage/server中的一个文件。使用Meteor.isServer修复了它,但实际上不应该需要在服务器目录中使用它。所以...显然,在api.addfiles()中,“client”和“server”声明具有优先权,并使包内部的此类目录名称变得不必要。 - Martin Bramwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接