有没有办法预编译node.js脚本并分发二进制文件而不是源文件?
答案 0 :(得分:13)
节点已经执行此操作。
“this”我的意思是创建机器可执行的二进制代码。它使用JIT pattern执行此操作。更多关于这一点,在我覆盖其他人谷歌搜索可能正在搜索...
操作系统原生的二进制可执行文件...... 如果通过二进制文件而不是源代码,则表示本机操作系统可执行文件,是的。 NW.JS和Electron都做得非常出色。
在node.js脚本中使用二进制文件...... 如果通过二进制文件而不是源代码,则表示将部分脚本编译为二进制文件的能力,因此难以或无法使用,或者您希望使用机器本机速度,是的。 它们被称为C/C++ Addons。您可以分发二进制文件(针对您的特定操作系统)并像调用任何其他var n = require(“blah”)一样调用它;
节点使用二进制文件“及时”
开箱即用,Node自己编译脚本并创建缓存的V8机器代码(想想“可执行” - 它使用运行的CPU节点本机的真实机器代码)然后执行每个事件它过程
以下是Google的参考资料,说明V8引擎实际上是编译成真实的机器代码,而不是虚拟机。
Google V8 JavaScript Engine Design
首次加载应用程序时会进行此编译。
只要您调用“require('module')”指令,它就会将这些代码段缓存为“模块”。
它不会等待您的整个应用程序被处理,而是在遇到每个“require”时预先编译每个模块。
require中的所有内容都被编译并引入内存,包括它的变量和活动状态。同样,与许多流行的博客文章相反,这是作为单独的机器代码进程执行的。没有VM,也没有任何解释。 JavaScript源本质上被编译成内存中的可执行文件。
这就是为什么每个模块只能引用相同的需求而不会产生一堆开销;它只是在内存中引用预编译和现有的对象,而不是“重新要求”整个模块。
您可以强制它随时重新编译任何模块。鲜为人知的是,您实际上可以非常轻松地控制重新编译这些对象,使您能够“热重新加载”应用程序的各个部分,而无需重新加载整个文件。
一个很好的用例是创建自修改代码,例如,从文件夹加载策略的策略模式,并且一旦添加新文件夹,您自己的代码就可以将文件夹重新编译为一个内联策略模式,创建一个“strategyRouter.js”文件,然后使路由器的节点缓存失效,迫使Node重新编译该模块,然后在未来的客户端请求中使用。
最终结果:只要您将新文件或文件夹放入应用程序,节点就可以热重新加载路由或策略。无需重新启动应用程序,无需分离无状态和有状态操作:只需将响应写为常规Node模块,并在更改时重新编译它们。
注意:在人们告诉我自我修改代码与eval
一样糟糕或更差之前,调试很糟糕且无法维护,请注意Node本身就是这样做的,所以做许多流行的Node框架。我没有解释原创研究,我正在设计解释谷歌V8引擎(以及Node)的能力,因为这个问题要求我们这样做。请不要拍摄那些关于FM的人,否则人们就会停止对它进行自我保护。
“Unix并不是为了阻止用户做蠢事,因为 这也会阻止他们做出聪明的事情。“ - Doug Gwyn
Angular 2,Meteor,新的基于开源节点的Light table IDE和其他一些框架朝着这个方向前进,以便进一步从代码中删除开发人员并使他们更接近应用程序。
如何重新编译(热重载)必需的节点模块?
这实际上非常简单......这是一个热门重新加载的npm,对于替代品只是Google“节点需要热重载”
https://www.npmjs.com/package/hot-reload
如果我想以一种惊人的新方式构建自己的框架和热重新加载怎么办?
与Node中的许多内容一样,这也非常简单。 Node就像服务器的jQuery! ; d