这听起来有点不合适,但我想调整一个相当大的JavaScript代码库的一部分,以便它可以在NodeJS上运行。代码以CommonJS样式编写,gulp
构建过程使用browserify
和deamdify
。我没有设置任何这些东西,而且我只是熟悉AMD与CommonJS模式。
我想这样做是为了将一些代码转换为服务器端API,以提高性能 - 但它仍然需要能够在浏览器中运行。
起初我以为我可以在不运行browserify的情况下简单地使用这些库,但是我遇到了这样的错误:
ReferenceError:未定义define
因为有些库是这样编写的:
/*global define*/
define([
'./defaultValue'
], function(
defaultValue) {
"use strict";
所以看起来我需要运行deamdify
,这是一个浏览器变换...因此我需要运行browserify?
然而,其中一个缺点似乎是它生成了一个单片Javascript
文件(当然),然后全部被解析,并因为它包含对浏览器对象的引用而失败(document.location
)哪个不存在。我希望不要使用引用浏览器对象的代码。
所以我的问题:
- 有关于如何进行的指导吗?任何教程?我在谷歌上找不到多少,但我可能会使用错误的条款。
- NodeJS是否与Browserify等效?构建一个单片Javascript文件然后运行似乎有点奇怪和没有必要 服务器端。
醇>
任何指导,建议等都非常欢迎。
答案 0 :(得分:1)
1)在节点内使用(大)浏览器代码库可能具有挑战性。我想创建一个为节点提供虚假浏览器环境的环境模块可以完成这项工作,但这可能需要做很多工作,你必须将每个浏览器环境引用更改为window
等,并引用环境模块。在那里,您可以决定代码在哪个环境中运行并提供适当的行为(例如,在浏览器中返回window
对象以及在节点环境中返回不同的内容。)
2) 首先:browserify是一个在nodejs之上运行的库,所以“NodeJS等同于Browserify”没有意义......至于避免单个javascript文件:有节点模块可以让你在节点中使用AMD模块(例如amdrequire,node-amd-loader),也许这可能会有所帮助。另一种方法是将AMD模块转换为节点模块 - 它取决于AMD模块的数量。
希望这有帮助