我正在寻找一种方法来保护某些javascript代码免于阅读/修改。我知道很多人认为这是不可能的,但仍然......
据我所知,Chrome的V8引擎在看到JS代码时会进行一些优化,可能会编译它(?)然后运行它。
所以我想知道是否可以使用V8的C ++ api将JS代码编译成机器代码/ chromecode,然后直接将其提供给Chrome(我不关心其他浏览器) ? 据说它不仅会更快,而且非人类可读,就像ASM一样。
这可能吗?
WebAssembly正在做这件事,所以我不明白为什么我们不能用JS代码来做这件事。 还有EncloseJS和pkg正在做类似的事情。
答案 0 :(得分:1)
V8开发者在这里。不,不可能提前编译JavaScript并仅将编译后的代码发送到浏览器。 V8(以及其他类似虚拟机)包含编译器,但它们不能用作独立编译器来生成独立的二进制文件。
理论上,您可以将JavaScript编译为WebAssembly - 理论上可以将任何两种图灵完备的编程语言相互编译。据我所知,今天没有这样的编译器。其中一个重要原因是最终结果的表现会很糟糕(详见Andreas Rossberg的讨论);因此,考虑到浏览器可以直接执行JavaScript,人们几乎没有理由开发这样的东西。 (这也是一项艰巨而艰巨的任务。)
至于你声明的目标:尽量使JavaScript代码不可读是为了缩小它。实际上,这实际上与生成汇编的想法一样好,因为存在将汇编转换为缩小的高级语言代码的反汇编程序;他们无法重建变量名称或注释(因为这些信息在编译过程中会丢失),但它们可以重建程序逻辑。
答案 1 :(得分:0)
WebAssembly没有这样做。不,它也不可能。 Web应该是独立于浏览器和硬件的。
此外,像JS这样的语言如果离线编译会不更快 - 它只是接近快速的东西,因为它是动态编译和优化的,考虑到动态的配置文件信息。
答案 2 :(得分:0)
我最终要做的是将一些逻辑从JavaScript转移到C ++,然后将其编译到NodeJS本机模块中(Electron应用程序可能实现这一点)。
它运行良好,速度非常快,源代码已得到尽可能的保护,但是您可能需要担心跨平台问题,而且编译/链接可能会有些麻烦,但是除此之外,这很棒。