在 Meteor 包中使用 npm

Posted

技术标签:

【中文标题】在 Meteor 包中使用 npm【英文标题】:Use npm in Meteor packages 【发布时间】:2015-01-22 20:14:41 【问题描述】:

试图找出将 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

我已经阅读了documentation 并且没有加载任何依赖项

我做错了什么?

更新 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 没有成功。 如果我可以使用“原生”方式就好了

【问题讨论】:

你的包文件结构是什么?你的语法对我来说很好。 github.com/meteorhacks/npm 这应该可以解决问题 @saimeunt 刚刚添加了 @Sindis 我已经尝试过了,但没有成功 你不需要提供 package.json,只需要一个 package.js 就在它自己的包目录下。 【参考方案1】:

您应该在 package.js 文件的末尾对所有 Npm.requires 进行分组。

对于future-npm。在package.js 中不需要Npm.depends,傻瓜。它已经包含在流星中......只是Npm.require某处,你很高兴。为此:

    不要对 package.js 名称产生歧义。请改用trepafi:package.js

    您不需要 package.json.. Npm.depends 已为您服务。

    删除这个:api.addFiles(['package.js'], ['client']);,因为它看起来像一个循环依赖.. 哟,我把你的 package.js 放在你的 package.js 中.. 不酷,Xzibit。

    由于 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' 声明具有优先权,并且使此类目录名称在包中变得不必要。

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

使用 Iron Router 在 Meteor 包中包含 HTML 模板

使用 Meteor 从 FB-graph 中提取照片

在 Meteor 帐户-密码中重置密码后禁用登录

Angular-Meteor - 如何在基于包的设计中包含 ng 模板?

包内的 Meteor Ionic Angular App - 如何链接到模板?

Meteor Cordova App:如何在 iOS 或 Android 上运行不同的代码