我如何findnpm包的哪些部分在浏览器中工作,哪些不是?

据我所知, 几乎所有的NPM包(即在npmjs.org上列出)在浏览器中都像一个魅力,使用像Require.js这样的加载器。 但是很显然,NPM软件包的某些function(例如,访问操作系统文件系统)不能在浏览器内部使用,如果尝试的话,我认为会导致不正确的错误。

  1. 我的理解有多正确?
  2. 有没有什么方法可以find一个NPM包中的哪些方法在浏览器中工作,哪些不会呢?

据我所知,几乎所有的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 {}; })); 

您可以在这里find关于CommonJS,AMD和UMD的更多信息。

但是很显然,NPM软件包的某些function(例如,访问操作系统文件系统)不能在浏览器内部使用,如果尝试的话,我认为会导致不正确的错误。

你是对的,大多数用于IO的NPM模块在浏览器中不起作用。 如果您打算使用Browserify在浏览器中使用CommonJS模块,请查看Browserify上的兼容模块列表 。

实际上,我相信在使用Browserify之类的东西时 ,几乎所有的软件包都不会有太多的问题…根据Browserify文档:

许多不做IO的npm模块只能在浏览完成后才能工作。 其他人需要更多工作。

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

不过, 我对 Browserify 没有经验,所以我不能保证给你; 但我可以肯定地说,这将是任何应用程序的额外的一层。 “它需要它吗?” 应该在这个时候被问到。

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