PHP JavaScript压缩器

6
我正在使用Hostgator的共享主机计划,因此无法从命令行运行任何Java。
是否有纯PHP缩小工具可用?Minify在后台使用YUICompressor.jar,因此无法使用该工具。
有人知道是否有仅使用PHP来缩小JavaScript并可从命令行运行的工具?我还希望它可以缩小变量名称。

6
在上传到服务器之前,您是否考虑过在其他地方进行代码缩小处理? - Jamison Dance
也许最简单的方法是使用 cURL 或类似工具调用 Web 服务来完成这个任务。 - Vitamin
@Jergason:不可能,因为我正在使用Git进行我的项目。 - qwertymk
http://code.google.com/p/jshrink-/ - Vamsi Krishna B
@qwertymk:使用git如何禁止您在上传到服务器之前缩小JS的大小? - JB Nizet
显示剩余6条评论
4个回答

3
您可以使用Google JS Minifier。以下是一个使用它来压缩一堆JavaScript文件的Python脚本:
import httplib
import simplejson as json
import urllib
import sys

def combine_js(js_files, minify=False):
    files = list(js_files) # create a copy which we can modify
    if not minify:
        code = []
        for path in files:
            f = open(path, 'r')
            code.append(f.read())
            f.close()
        return '\n\n'.join(code)

    def _minify(code):
        params = urllib.urlencode([
            ('js_code', code),
            ('compilation_level', 'SIMPLE_OPTIMIZATIONS'),
            ('output_format', 'json'),
            ('output_info', 'compiled_code'),
            ('output_info', 'errors'),
            ('output_info', 'warnings'),
        ])

        headers = {'Content-type': "application/x-www-form-urlencoded"}
        conn = httplib.HTTPConnection('closure-compiler.appspot.com')
        conn.request('POST', '/compile', params, headers)
        response = conn.getresponse()
        data = json.loads(response.read())
        conn.close()
        if not data.get('compiledCode'):
            print >>sys.stderr, 'WARNING: Did not get any code from google js compiler.'
            print >>sys.stderr, data
            print >>sys.stderr
            print >>sys.stderr, 'Using unminified code'
            return None
        return data.get('compiledCode')

    # Minify code in chunks to avoid the size limit
    chunks = []
    code = ''
    while len(files):
        path = files[0]
        f = open(path, 'r')
        data = f.read()
        f.close()
        # Check if we reach the size limit
        if len(code + data) >= 1000000:
            res = _minify(code)
            if res is None:
                # Fallback to unminified code
                return combine_js(js_files)
            chunks.append(res)
            code = ''
            continue
        code += data
        del files[0]
    if code:
        res = _minify(code)
        if res is None:
            # Fallback to unminified code
            return combine_js(js_files)
        chunks.append(res)
    return '\n\n'.join(chunks).strip()

if __name__ == '__main__':
    print combine_js(sys.argv[1:], True)

用法:python 文件名.py 路径/到/你的/*.js > 压缩.js


如果你使用的是古老版本的Python并且没有安装simplejson,以下是如何使脚本能够与本地的simplejson版本一起运行(通过SSH运行以下命令):

cd
wget http://pypi.python.org/packages/source/s/simplejson/simplejson-2.3.2.tar.gz
tar xzf simplejson-2.3.2.tar.gz
export PYTHONPATH=$HOME/simplejson-2.3.2/

这段代码来自于我的一个正在运行的网站。我只是删除了一些周围的内容并添加了独立的__main__块。我没有测试过那个版本,但测试过原始脚本。 - ThiefMaster
啊,语法错误已经修复了。只是一个逗号放错位置了。你得到的错误意味着你正在使用旧版本的Python。你需要至少2.6才能运行它(这已经相当老了,2.7是最近的版本!) - ThiefMaster
我仍然遇到这个错误,文件“python.py”,第11行 with open(path, 'r') as f: ^ 语法错误:无效的语法。有什么解决方法吗? - qwertymk
不,我刚刚修改了它,不再使用 with 语句;现在可能可以在旧版本的 Python 中运行。 - ThiefMaster
让我们在聊天中继续这个讨论。点击这里进入聊天室 - ThiefMaster
显示剩余3条评论

1

Minify的默认选项不是YUIC,而是一个本地的 JSMin PHP端口 再加上一些 bug 修复。

我发现的其他本地 PHP JavaScript 压缩工具:

  • JSqueeze (未测试,但看起来很强大)
  • JShrink (未测试,但像 JSMin 一样采用简单的标记删除设计)
  • JSMin+ (不保留/*!注释,混淆条件注释)

1
如果你考虑其他的JavaScript压缩器/最小化工具,可以看看dean edward的packer的PHP版本:http://joliclic.free.fr/php/javascript-packer/en/ 有一个在线演示可供使用,这样你就可以在线测试它(强烈建议在尝试在自己的服务器上安装之前进行在线测试)。我进行了快速的在线测试,得到了一个正确工作的最小化JavaScript文件。它应该能够完成任务。

0
找一个在线的基于Web的JS压缩器,然后通过PHP使用cURL或file_get_contents等方式查询他们的
。我想在这种方式下,您可能需要先向在线服务请求许可才能使用他们的服务。

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