JavaScript代码的反压缩/解压缩

15

原问题

这可能是一个愚蠢的问题,但在VS 2013中是否有一种方法可以还原压缩的JavaScript?

只是确保我们都在同一页上。

压缩:

var flashVer=-1;if(navigator.plugins!=null&&navigator.plugins.length>0){if(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]){var swVer2=navigator.plugins["Shockwave Flash 2.0"]?"

这只是一个例子,以确保我们都知道我在说什么。据我所知,没有办法做到这一点。我只使用VS 2013大约3周,所以可能还有一些对我隐藏的东西。

如果程序中没有办法做到这一点,那么下一步最好的选择是什么呢? 我在另一个类似的帖子上看到了推荐网站http://jsbeautifier.org/,所以可能不妨试试,但如果它内置在VS 2013中会更方便。

提前感谢您的帮助。


更新:

我在VS 2013中找不到任何可以帮助我解决这个问题的东西,就像我之前说过的,可能有一些我错过了的东西(某些设置),所以如果它不能在VS中完成,那么下一步最好的选择是什么呢?我似乎碰到了相当多的JS代码被压缩了,想要最快和最好的方法来完成工作。我尝试过几个站点似乎都有问题,有没有我可以安装的程序,只需使用热键或其他方式即可轻松完成。那会很方便。


更新2:

所以,我认为可以肯定地说这不能在VS2013中完成,或者说根本无法完成,因为缺少变量名等。我看到了一些链接和程序,可以让您格式化代码。是否有办法在VS2013中完成?如果不是,那么我可以使用哪个最可靠的网站/程序来执行此操作。就像我所说的,我可以看到已经有答案了,我很感激所有答案。我会将这个问题保持开放状态一段时间,以便更多的人查看并可能给出更好的答案。继续下去伙计们!


更新3:

如果有人对此有更多信息,请分享。我仍在寻找机会,等待有人为此提供惊人的解决方案。总有一天....总有一天!


1
问题的 PHP 部分在哪里?为什么你给这个问题打了 php 的标签? - Dalım Çepiç
只是为了让更多来自各个领域的人看到我的问题。看到它的人越多,我得到更好答案的机会就越大。JavaScript 可以与我使用的每个标签一起使用。如果你会 PHP,你很可能也会 JavaScript。 - Ruddy
这是一个一般性问题还是只针对VS的? - Dmitri Zaitsev
这是一个以VS为起点,然后转向“通用”问题的提问。如果您阅读了我在更新中所写的内容,那应该已经解释清楚了。如果没有,请看一下一些答案。 - Ruddy
6个回答

7
问题在于,您无法真正“取消最小化”您的代码,因为某些数据已经丢失 - 例如变量名称。但是,您可以将其重新格式化为更可读的形式。

  1. 根据这个问题,自VisualStudio 2012以来,您只需使用 Ctrl+E, D 快捷键即可。
  2. 如果上述方法不正确,则可以使用VS 2010的此扩展程序:http://visualstudiogallery.msdn.microsoft.com/41a0cc2f-eefd-4342-9fa9-3626855ca22a,但我不确定它是否适用于VS 2013。
  3. 有一个名为ReSharper的VisualStudio扩展程序,可以以几种不同的方式重新格式化javascript。
  4. 另外,在其他答案中已经提到了在线格式化程序(如果您的代码是机密的,我建议通过下载源代码并在本地使用它们来表现某些偏执症)。
  5. 此外,您可以随时尝试在互联网上查找所需库的未最小化版本。
  6. 还有JetBrains的WebStorm IDE,可以重新格式化JS - 您可以下载试用版,仅用于重新格式化已最小化的脚本 :)
  7. 如果只是为了更轻松地进行调试,您可能需要使用源映射
此外,这里有一堆相关问题:

如何自动缩进源代码? <-- 这是针对VS2010的,但看起来很有前途,如果它支持JavaScript(根据MS支持,自VS2012以来确实支持):

在Visual Studio中重新格式化(reindent/reformat)被压缩的jQuery/JavaScript文件

Visual Studio 2010无法格式化复杂的JavaScript文档

Visual Studio代码格式化程序

如何使Visual Studio JavaScript格式化工作?

我不确定是否已经找到了重新格式化JS的有效方法,但我看到了一些答案,可能会有所帮助 - 我只是将其粘贴在这里作为FYI。

添加于03.06.2014:

http://www.jsnice.org/

这个工具也可能很有用,它甚至尝试推断压缩名称。正如他们网站上所述:

We will rename variables and parameters to names that we learn from thousands of open source projects.

谢谢你的回答,非常有帮助,付出了很多努力。我打算等待更多人看到这个问题,看看是否还有其他人有更多的信息。 - Ruddy
刚刚看到你发布的更新,那个网站很酷。谢谢分享。 - Ruddy

5

这只是一种单向转换......抱歉,在普通情况下,您将无法从压缩的JavaScript中获得可理解的内容!

让我们来快速看一下jQuery源代码:

(function( window, undefined ) {

// Can't do this because several apps including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
// Support: Firefox 18+
//"use strict";
var
    // The deferred used on DOM ready
    readyList,

    // A central reference to the root jQuery(document)
    rootjQuery,

    // Support: IE<10
    // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
    core_strundefined = typeof undefined,

    // Use the correct document accordingly with window argument (sandbox)
    location = window.location,
    document = window.document,
    docElem = document.documentElement,

    // Map over jQuery in case of overwrite
    _jQuery = window.jQuery,

    // Map over the $ in case of overwrite
    _$ = window.$,

    // [[Class]] -> type pairs
    class2type = {},

    // List of deleted data cache ids, so we can reuse them
    core_deletedIds = [],

    core_version = "1.10.2",
------

现在让我们来看一下压缩后的源代码:

(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,
l=e.jQuery,u=e.$,c={},p=[],f="1.10.2", ....

我想现在你已经看到了 =>
window       => e
undefined    => t
readyList    => n
rootjQuery   => r
core_strundefined  => i
location     => o
document     => a 

所以它被映射成更短的形式,在这里进行压缩。

人们通常会使用此功能,因此没有回头路。

你可以在这里格式化它。


5

就我个人而言,我无法想到任何理由去解压代码^:

  • 如果您正在使用编译后的js文件(如Google Closure),并希望获得更可读的代码以进行调试,请使用针对受支持库提供的源映射(说到jQuery,如果它是从Google CDN服务中获取的,则已将其映射到正确的源)。

  • 如果您在使用仅包含空格的压缩js文件,并希望获取更可读的代码以进行调试,则可以在浏览器中切换精美打印(Pretty Print). 这似乎最适合您的问题。

  • 如果您使用上述任何一种方式,并希望修改第三方js文件的源代码,请不要这样做。任何未来版本的发布都会取消您的更改- 而是考虑使用许多扩展框架的模式之一(或者,根据具体情况做一些鸭子打补丁)。

其他答案似乎很好地涵盖了“解压缩”(最大化?)过程,但首先确保这是必要的步骤是值得的。

^ - 除非版本控制崩溃,没有备份,并且文件的唯一版本是浏览器缓存中的经过最小化的副本。别问为什么。


2
如果代码只被压缩了,那么自动化的最佳做法是重新格式化以使其更易读。一种方法是使用在线格式化程序/美化程序。例如,将您发布的代码行复制并粘贴到 http://jsbeautifier.org/http://www.jspretty.com/,它会产生类似于以下内容的东西:
var flashVer = -1;
if (navigator.plugins != null && navigator.plugins.length > 0) {
    if (navigator.plugins["Shockwave Flash 2.0"]
            || navigator.plugins["Shockwave Flash"]) {
        var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? ""

当然,这些工具并不能恢复被压缩器删除的任何注释。如果代码还被混淆,那么它将变得难以阅读,因为变量名已更改(例如,var flashVer 变成了 var a)。请参见这里获取更多详细信息。


2

从其他答案中可以看出,无法将压缩后的JavaScript还原为原始形式,这是一种有损压缩。最好的方法是通过重新格式化使其可读。

如果代码是开源的,则很可能在某些版本控制网站或zip文件中以原始状态存在。如果有原始版本可用,为什么不直接下载呢?


有时候我会遇到一些看起来很随机的 JS 代码,而且似乎没有其他的副本(或者我找不到)。谢谢你的回答。 - Ruddy
此外,Komodo IDE 在其编辑器中提供了 jsbeautify。我很惊讶 VS2013 没有类似的插件系统。 - Xotic750

1

谢谢你的回答,但是你给出的第一个链接已经被提到过了,而第二个链接与问题无关。在发表自己的回答之前,请先阅读其他的答案。 - Ruddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接