据我了解,几乎所有 NPM 包(即在 npmjs.org 上列出的)都像浏览器中的魅力一样工作,使用诸如 Require.js 之类的加载器。但显然 NPM 包的某些功能(例如,访问 OS 文件系统)不能在浏览器中使用,我认为如果尝试这样做会导致不正常的错误。
- 我的理解有多正确?
- 有什么方法可以准确地找出 NPM 包中的哪些方法可以在浏览器中工作,哪些不能?
据我了解,几乎所有 NPM 包(即在 npmjs.org 上列出的)都像浏览器中的魅力一样工作,使用诸如 Require.js 之类的加载器。
一般来说,npm 模块作为 CommonJS 模块公开,除非您使用Browserify 之类的东西,否则不能在浏览器中使用。但是,如果模块将自身暴露为 CommonJS和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的更多信息。
但显然 NPM 包的某些功能(例如,访问 OS 文件系统)不能在浏览器中使用,我认为如果尝试这样做会导致不正常的错误。
没错,大多数 IO 的 NPM 模块都不能在浏览器中运行。如果你打算在 Browserify 中使用 CommonJS 模块,请查看 Browserify 上的兼容模块列表。
实际上,我相信在使用Browserify 之类的东西时,您几乎可以要求每个包都没有太多问题……根据 Browserify 文档:
许多不做 IO 的 npm 模块在被浏览器化后才可以工作。其他人需要更多的工作。
许多 node 内置模块已被包装以在浏览器中工作,但仅当您显式 require() 或使用它们的功能时。
但是,我对Browserify 没有经验,所以我无法向您保证;但我可以肯定地说,这将是任何应用程序中的一个额外层。“需要吗?” 应该在这种时候问。
因为我是一个喜欢只使用 npm 管理 Node.js 包的人,所以我反对尝试以这种方式在浏览器中使用它们。
大多数与浏览器兼容的软件包会在为此目的进行测试时通知用户(未经测试的软件包不值得使用!mwahahah!)。