2013 Meteor NPM Packages

后端 未结 5 1032
青春惊慌失措
青春惊慌失措 2020-11-30 01:07

Update this solution describes how to effectively use the new Npm system in Meteor.


What is the current method of using NPM packages i

5条回答
  •  抹茶落季
    2020-11-30 01:17

    I have been using the fantastic "browserify", which works like a charm. This is an alternative to using Arunda's NPM Atmosphere package, or using Npm.require with package.js, that arguably has some advantages:

    1. My code can use plain old "require" instead of Npm.require or Meteor.require. Obviously this is not a huge deal, but if I want to use this code outside Meteor it's nice to feel it's not dependent on Meteor.
    2. I don't have to worry about whether Meteor will once again change the way it thinks about Npm integration again.
    3. It allows me to use local development version of my own npm modules using npm link.

    Here's how it works:

    1. I create a separate project for npm dependencies in a hidden .npm folder
    2. I use browserify to create a bundle.js that will be loaded by meteor
    3. I use grunt watch to make sure that every time I install a new npm package, the bundle.js is updated

    Here's my directory structure:

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

    Here's an example of entrypoint.js (unfortunately I have to use globals so that assert, url, and _ are available in Meteor code)

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

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

    I then use grunt watch to watch for changes to entry.js or new NPM installs

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

    And then if I install an npm module, or modify entrypoint.js, bundle.js is updated:

    $ 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...
    

提交回复
热议问题