1

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

  1. 我的理解有多正确?
  2. 有什么方法可以准确地找出 NPM 包中的哪些方法可以在浏览器中工作,哪些不能?
4

2 回答 2

2

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

一般来说,npm 模块作为 CommonJS 模块公开,除非您使用Browserify 之类的东西,否则不能在浏览器中使用。但是,如果模块将自身暴露为 CommonJSAMD 模块,则可以使用 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的更多信息。

但显然 NPM 包的某些功能(例如,访问 OS 文件系统)不能在浏览器中使用,我认为如果尝试这样做会导致不正常的错误。

没错,大多数 IO 的 NPM 模块都不能在浏览器中运行。如果你打算在 Browserify 中使用 CommonJS 模块,请查看 Browserify 上的兼容模块列表

于 2013-08-07T09:44:23.367 回答
1

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

许多不做 IO 的 npm 模块在被浏览器化后才可以工作。其他人需要更多的工作。

许多 node 内置模块已被包装以在浏览器中工作,但仅当您显式 require() 或使用它们的功能时。

但是,我对Browserify 没有经验,所以我无法向您保证;但我可以肯定地说,这将是任何应用程序中的一个额外层。“需要吗?” 应该在这种时候问。

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

于 2013-08-07T04:30:53.303 回答