如何在浏览器中要求CommonJS模块?

时间:2011-09-27 21:39:42

标签: javascript node.js commonjs

在浏览器中将CommonJS模块加载为客户端javascript的最佳方法是什么?

CommonJS模块将其功能放在module.exports命名空间中,通常在服务器端脚本中使用require(pathToModule)包含。在客户端加载它们不能以相同的方式工作(需要更换,需要考虑异步等)。

我找到了模块加载器和其他解决方案:Browserify,RequireJS,yabble等,或者简单地改变模块的方法。您认为最好的方式和原因是什么?

6 个答案:

答案 0 :(得分:45)

我过去曾广泛使用requirejs(2010年在BBC iPlayer上实施)并且效果很好。它可以处理CommonJS模块,但它需要一个额外的包装器,我觉得很烦人。 如果你想在node.js中使用那些模块,你也需要在服务器端使用requirejs,我不喜欢这样做,因为它不是惯用的node.js JavaScript。

过去一年,我在一些项目中使用了webmakebrowserify。最初,编译步骤让我失望,但今年广泛使用它,我可以说这不是问题。

Browserify包含一个手表功能,效果非常好。 Webmake可以连接到观察者(例如watchr),或者,您可以使用webmake-middleware模块,该模块可以用作快速或连接应用程序的一部分。这样做的好处是,不是在每次保存时编译JavaScript,而是仅在实际请求时编译它。 Connect使得创建服务器(也是静态的)变得微不足道,因此如果你想在没有后端的情况下开发前端,你可以创建一个小的静态node.js服务器来提供你的文件。

Bonus:不需要构建脚本,因为你总是处理构建的代码。

答案 1 :(得分:17)

以下是您在GitHub上按各自受欢迎程度(观察人数)排序的当前选项的完整列表:

  

Options for use of require() in the browser(Wayback Machine档案)

答案 2 :(得分:11)

Browserify怎么样? 它的描述是:“浏览器端require()用于你的节点模块和npm包”这听起来你需要的。

答案 3 :(得分:2)

CommonJS编译器https://github.com/dsheiko/cjsc 为什么?它与nodejs(CommonJs)模块/处理模块完全一样,与nodejs /和UMD一起工作,为编译的JavaScript带来最少的额外代码,允许导出第三方库的全局变量而不触及他们的代码,源地图和其他不能做的技巧:

var str = require( "lorem-ipsum.txt" );
console.log( str );

输出:

 Lorem ipsum dolor 
 sit amet, consectetur 
 adipiscing elit. Morbi...

幻灯片https://speakerdeck.com/dsheiko/modular-javascript-with-commonjs-compiler

答案 4 :(得分:0)

Webmake是其中一个选项。我使用它来打包由超过20个模块的20多个模块构建的应用程序。它有效。

如果你想看一些例子,请检查:SoundCloud Playlist Manager,它是严格的客户端并使用Webmake构建

答案 5 :(得分:-2)

不能说我已经尝试了你在这里列出的其他人,但我喜欢RequireJS,因为:

  • 它的工作方式与CommonJS相似
  • 易于使用
  • 它实施了一些即将推出的新标准
  • 您可以在NodeJS中使用它,以便您可以在服务器和客户端中使用相同的文件
  • 它包括用于部署到producion的缩放器/打包器
  • 它有插件。 Text插件可以加载HTML文件,对大型应用程序非常有用。