how to require from URL in Node.js

前端 未结 6 2333
一个人的身影
一个人的身影 2020-11-28 07:54

Is there a standard way to require a Node module located at some URL (not on the local filesystem)?

Something like:

require(\'http://example.com/node         


        
相关标签:
6条回答
  • 2020-11-28 08:29

    You can fetch module using http.get method and execute it in the sandbox using vm module methods runInThisContext and runInNewContext.

    Example

    var http = require('http')
      , vm = require('vm')
      , concat = require('concat-stream'); // this is just a helper to receive the
                                           // http payload in a single callback
                                           // see https://www.npmjs.com/package/concat-stream
    
    http.get({
        host: 'example.com', 
        port: 80, 
        path: '/hello.js'
      }, 
      function(res) {
        res.setEncoding('utf8');
        res.pipe(concat({ encoding: 'string' }, function(remoteSrc) {
          vm.runInThisContext(remoteSrc, 'remote_modules/hello.js');
        }));
    });
    

    IMO, execution of the remote code inside server application runtime may be reasonable in the case without alternatives. And only if you trust to the remote service and the network between.

    0 讨论(0)
  • 2020-11-28 08:32

    0 dependency version (node 6+ required, you can simply change it back to ES5)

    const http = require('http'), vm = require('vm');
    
    ['http://example.com/nodejsmodules/myModule.js'].forEach(url => {
        http.get(url, res => {
            if (res.statusCode === 200 && /^text\/javascript/.test(res.headers['content-type'])) {
                let rawData = '';
                res.setEncoding('utf8');
                res.on('data', chunk => { rawData += chunk; });
                res.on('end', () => { vm.runInThisContext(rawData, url); });
            }
        });
    });
    

    It is still the asynchronous version, if sync load is the case, a sync http request module for example should be required

    0 讨论(0)
  • 2020-11-28 08:32
    
      const localeSrc = 'https://www.trip.com/m/i18n/100012631/zh-HK.js';
      const http = require('http');
      const vm = require('vm');
      const concat = require('concat-stream');
      http.get(
        localeSrc,
        res => {
          res.setEncoding('utf8');
          res.pipe(
            concat({ encoding: 'string' }, remoteSrc => {
              let context = {};
              const script = new vm.Script(remoteSrc);
              script.runInNewContext(context);
              console.log(context);
            }),
          );
        },
        err => {
          console.log('err', err);
        },
      );
    
    0 讨论(0)
  • 2020-11-28 08:33

    Install the module first :

    npm install require-from-url
    

    And then put in your file :

    var requireFromUrl = require('require-from-url/sync');
    requireFromUrl("http://example.com/nodejsmodules/myModule.js");
    
    0 讨论(0)
  • 2020-11-28 08:39

    You could overwrite the default require handler for .js files:

    require.extensions['.js'] = function (module, filename) {
        // ...
    }
    

    You might want to checkout better-require as it does pretty much this for many file formats. (I wrote it)

    0 讨论(0)
  • 2020-11-28 08:45

    If you want something more like require, you can do this:

    var http = require('http')
      , vm = require('vm')
      , concat = require('concat-stream') 
      , async = require('async'); 
    
    function http_require(url, callback) {
      http.get(url, function(res) {
        // console.log('fetching: ' + url)
        res.setEncoding('utf8');
        res.pipe(concat({encoding: 'string'}, function(data) {
          callback(null, vm.runInThisContext(data));
        }));
      })
    }
    
    urls = [
      'http://example.com/nodejsmodules/myModule1.js',
      'http://example.com/nodejsmodules/myModule2.js',
      'http://example.com/nodejsmodules/myModule3.js',
    ]
    
    async.map(urls, http_require, function(err, results) {
      // `results` is an array of values returned by `runInThisContext`
      // the rest of your program logic
    });
    
    0 讨论(0)
提交回复
热议问题