☰ Оглавление

Простой минификатор/оптимизатор JavaScript

Для больших JavaScript-проектов я рекомендую использовать grunt, который умеет всё. Но если нужно минифицировать один-два коротких скрипта, то разворачивать целый grunt нет смысла. Можно воспользоваться API closure compiler. Для этого достаточно простенького скрипта. Я использую такой.

#!/usr/bin/python3

import http.client as httplib, urllib.parse as urllib, sys

def main():
    files = sys.argv[1:]
    if files:
        for src_file in files:
            if src_file[-3:] == '.js':
                tgt_file = src_file[:-3] + '.min.js'
            else:
                print('Warning: left not .js file')
                continue
            print('%s -> %s' % (src_file, tgt_file))
            js_code = open(src_file, 'r').read().encode('utf-8')
            # https://developers.google.com/closure/compiler/docs/api-ref
            params = urllib.urlencode((
                ('js_code', js_code),
                ('compilation_level', 'SIMPLE_OPTIMIZATIONS'),
                ('output_format', 'text'),
                ('output_info', 'compiled_code'),
            ))
            # Use the following value for the Content-type header. Always!
            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 = response.read()
            conn.close()
            open(tgt_file, 'w').write(data.decode('utf-8'))
    else:
        print('Specify JavaScript files')

if __name__ == '__main__':
    main()

Запускать его очень просто:

rjsmin src_file_1.js src_file_2.js ...

Его можно поправить по вкусу. Если вы ещё не перешли на Python 3, то вам надо поправить import. Остальное будет работать в любой версии.

Если не работает — пишите.