天天看點

Python壓縮JS檔案,重點是 slimit

作者:華為雲開發者聯盟

本文分享自華為雲社群《Python壓縮JS檔案,PythonWeb程式員必看系列,重點是 slimit-雲社群-華為雲》,作者: 夢想橡皮擦 。

本篇部落格将學習壓縮 JS 代碼,首先要學習的子產品是 jsmin。

jsmin 庫

Python 中的 jsmin 庫來壓縮 JavaScript 檔案。這個庫可以通過删除不必要的空格和注釋來最小化 JavaScript 代碼。

庫的安裝

在控制台使用如下指令即可安裝,注意如果網絡不好,請切換國内源。

pip install jsmin           

jsmin 庫代碼示例

在壓縮前,請提前準備一個未被壓縮的 JS 檔案,便于對口前後效果。

import jsmin
with open("jquery.tweetscroll.js", "r", encoding='utf-8') as input_file:
 with open("output.js", "w", encoding='utf-8') as output_file:
 output_file.write(jsmin.jsmin(input_file.read()))           

下圖可直覺查閱壓縮前與壓縮後的效果。

Python壓縮JS檔案,重點是 slimit

壓縮 JS 檔案核心用到的函數是 jsmin.jsmin(input_file.read()),其 jsmin() 詳細說明如下。

這個函數接受一個字元串參數,表示要壓縮的 JavaScript 代碼。它會移除不必要的空格、注釋和換行符,并傳回壓縮後的 JavaScript 代碼。注意該方法不支援 ECMAScript 6 新特性。

jsmin.jsmin(javascript_code)           

rjsmin 庫

rjsmin 是 Python 編寫的 JavaScript 代碼壓縮工具,該庫的使用與 jsmin 基本一緻,壓縮速度會快一些,所有的邏輯都使用正規表達式實作。

庫的安裝

使用下述指令進行安裝,該庫包含 rjsmin 庫。

pip install rjsmin           

rjsmin 庫代碼示例

import rjsmin
with open("jquery.tweetscroll.js", "r", encoding='utf-8') as input_file:
 with open("output.js", "w", encoding='utf-8') as output_file:
 output_file.write(rjsmin.jsmin(input_file.read()))           

slimit 庫

slimit 是一個 Python 庫,它可以用來壓縮 JavaScript 代碼。slimit 是一個純 Python 實作,它沒有依賴其它庫,可以在任何環境下使用。

slimit 使用了 LALR(1) 文法分析器來解析 JavaScript 代碼,并使用自己的算法來壓縮代碼。它支援壓縮 ECMAScript 5 代碼,包括使用了 ECMAScript 5 的嚴格模式。

庫的安裝

pip install slimit           

slimit 庫的使用

slimit 的用法非常簡單,提供了一個名為 slimit() 的函數,可以将 JavaScript 代碼作為字元串傳入,并傳回壓縮後的 JavaScript 代碼。

from slimit import minify
text = """
var foo = function( obj ) {
        for ( var name in obj ) {
                return false;
        }
        return true;
};
"""
js_cdoe = minify(text, mangle=True, mangle_toplevel=True)
print(js_cdoe)           

首次運作忽略代碼警告即可。

Python壓縮JS檔案,重點是 slimit

slimit 庫的其他用途

周遊、修改 JavaScript AST

from slimit.parser import Parser
from slimit.visitors import nodevisitor
from slimit import ast
parser = Parser()
tree = parser.parse('for(var i=0; i<10; i++) {var x=5+i;}')
for node in nodevisitor.visit(tree):
 if isinstance(node, ast.Identifier) and node.value == 'i':
 node.value = 'hello'
print(tree.to_ecma())           

關注#華為雲開發者聯盟# 點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲