如何找到npm包的哪些部分在浏览器中工作,哪些不工作?

时间:2013-08-07 02:28:18

标签: node.js requirejs

据我了解,几乎所有NPM软件包(即在npmjs.org上列出)在浏览器中使用诸如Require.js之类的加载器。但显然NPM软件包的一些功能(例如,访问操作系统文件系统)不能在浏览器中使用,我认为如果尝试它会导致错误的错误。

  1. 我的理解有多正确?
  2. 有没有办法找出NPM包中哪些方法在浏览器中有效,哪些方法不起作用?

2 个答案:

答案 0 :(得分:2)

  

据我所知,几乎所有的NPM软件包(即在npmjs.org上列出的)都像浏览器中的一个魅力一样,使用诸如Require.js之类的加载器。

一般来说,npm模块作为CommonJS模块公开,除非使用Browserify之类的东西,否则不能在浏览器中使用。但是,如果模块将自身公开为CommonJS AND AMD模块,则可以使用AMD加载程序(例如RequireJS)在浏览器中使用它。如果代码库中有与此代码段相似的内容,您可以确定模块是否与AMD兼容:

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(factory);
    } else if (typeof exports === 'object') {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like enviroments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals (root is window)
        root.returnExports = factory();
  }
}(this, function () {

    // Just return a value to define the module export.
    // This example returns an object, but the module
    // can return a function as the exported value.
    return {};
}));

您可以找到有关CommonJS,AMD和UMD here的更多信息。

  

但显然NPM软件包的一些功能(例如,访问操作系统文件系统)不能在浏览器中使用,如果尝试的话,我认为会导致错误的错误。

你是对的,IO的大多数NPM模块都不能在浏览器中运行。如果您打算使用Browserify在浏览器中使用CommonJS模块,请查看Browserify上的list of compatible modules

答案 1 :(得分:1)

实际上,我相信在使用像Browserify之类的东西时,几乎每个包都没有太多问题......根据Browserify文档:

  

许多没有执行IO的npm模块只会在工作之后才能工作   browserified。其他人则需要更多的工作。

     

许多节点内置模块已被包装在浏览器中工作,   但只有在明确要求(或使用其功能)时才会使用。

然而,我不是对Browserify有经验,所以我无法确保它;但我可以肯定地说,这将是任何应用程序中的额外层。 “它需要它吗?”应该在这样的时刻被问到。

由于我是一个喜欢用npm管理Node.js包的人,我不反对尝试在浏览器中使用它们。
大多数浏览器兼容的软件包会在为此目的进行测试时通知用户(未经测试的软件包不值得使用! mwahahah!)。