Paquetes de NPM Meteor 2013

Actualizar esta solución describe cómo usar efectivamente el nuevo sistema Npm en Meteor.


¿Cuál es el método actual de usar paquetes de NPM en Meteor?

A partir del 22 de marzo de 2013, no hay documentación oficial al respecto.

Hay varias preguntas sobre esto, especialmente esta , sin embargo, la solución parece obsoleta: la twig del motor ya no existe, y no he podido encontrar nada en Npm.require en Meteor.

Otra solución, publicada aquí , ordena instalarla en las carpetas .meteor/ build. Como estoy instalando en Heroku, esto no parece ser una solución válida, ya que el meteor bundle construcción usa un meteor bundle para agrupar el progtwig antes de ejecutarlo. Por lo tanto, las carpetas de comstackción temporal no parecen una opción válida.

¿Qué le ha pasado a Npm en el meteoro? ¿Cuál es la última forma de usar paquetes NPM?

En una nota relacionada, estoy tratando de usar el SDK de Amazon (para s3) – ¿sería mejor simplemente empaquetarlo como un paquete de Meteorito?

Arunoda ha creado un paquete NPM Atmosphere que le permite usar cualquier módulo NPM como lo está acostumbrado. Es muy sencillo.

Primero, mrt add npm .

También puede instalar el paquete utilizando el comando meteor-npm de npm install -g meteor-npm .

A continuación, cree un archivo packages.json en su directorio de proyecto raíz, con los nombres y versiones de los paquetes:

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

Finalmente, utilícelos con Meteor.require , así: var FooBar = Meteor.require('foobar');

La forma actual de usar los MNP en Meteor

  1. Reemplace las x de abajo con el nombre de NPM
  2. Coloque el siguiente esquema de archivos en / meteor-project-root / packages / x /
  3. meteoro agregar x
  4. Para usarlo simplemente llame a X en su código (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"]); }); 

Nota: algunos paquetes solo funcionarán en el cliente o servidor; si tiene problemas, intente incluir solo el lado en el que lo va a usar.

He estado usando el fantástico ” browserify “, que funciona como un encanto. Esta es una alternativa al uso del paquete Atmosphere NPM de Arunda , o al usar Npm.require con package.js , que podría decirse que tiene algunas ventajas:

  1. Mi código puede usar el antiguo “requerir” en lugar de Npm.require o Meteor.require. Obviamente, este no es un gran problema, pero si quiero usar este código fuera de Meteor, es agradable sentir que no depende de Meteor.
  2. No tengo que preocuparme si Meteor volverá a cambiar la forma en que piensa sobre la integración de NPM.
  3. Me permite usar la versión de desarrollo local de mis propios módulos npm usando el enlace npm.

Así es como funciona:

  1. Creé un proyecto separado para dependencias npm en una carpeta oculta .npm
  2. Yo uso browserify para crear un bundle.js que será cargado por meteor
  3. Uso el reloj ronco para asegurarme de que cada vez que instale un nuevo paquete npm, se actualice el paquete.js

Aquí está mi estructura de directorio:

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

Aquí hay un ejemplo de entrypoint.js (desafortunadamente tengo que usar globales para que assert, url y _ estén disponibles en el código Meteor)

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

Aquí está el gruñido:

 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']); }; 

Luego uso el reloj ronco para ver los cambios en entry.js o nuevas instalaciones de NPM

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

Y luego, si instalo un módulo npm, o modulo entrypoint.js, se actualiza 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... 

Puedes usar https://atmospherejs.com/meteorhacks/npm

 meteor add meteorhacks:npm 

Y luego puede configurar su archivo package.json:

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

Y usa estos paquetes:

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

como está usando un meteor, cuando instala un módulo de nodo en .meteor/local/build/server/ que realmente instala en

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

Cuando utiliza el mrt bundle para crear su paquete de implementación, los paquetes adicionales también se incluyen.

No lo probé en Heroku, pero verifiqué que el módulo de nodo se empaqueta cuando usa el paquete mrt.