为了让我的 CoffeeScript 代码同时在 Node.js 和 JavaScript 上运行,我应该小心避免什么?显而易见的答案是"不要使用 Node.js"函数,但我想知道是否有其他小的"陷阱"会破坏在两者之间移植代码。
假设您不依赖语言本身以外的任何 API(例如,除了 setTimeout
/clearTimeout
和 setInterval
/clearInterval
以及附加到 Math
的函数之外,您不使用任何其他函数(,只有两件事需要担心:
-
你可以依靠较新的JS功能,如
Array::forEach
和Array::indexOf
在Node中存在,但不能在浏览器中。CoffeeScript 可帮助您分别使用for x in arr
和if x in arr
语法避免这两个陷阱。 -
在浏览器中,全局对象是
window
;在 Node 中,全局对象是global
的,但你通常希望导出内容。因此,通常的解决方案,如Underscore.js和其他人所演示的那样,是在模块顶部编写root = this
并将所有内容附加到root
。在最外层的范围内,this
指向浏览器中的window
和 Node 中的exports
。
我在这里假设您在单个脚本中定义模块。如果没有,你应该看看像sstephenson's stitch这样的工具,它允许你编写一组可以在Node中相互require
的模块,然后将它们"拼接"在一起用于浏览器。