摘要:Python Web程式員必看系列,學習如何壓縮 JS 代碼。 本文分享自華為雲社區《Python壓縮JS文件,PythonWeb程式員必看系列,重點是 slimit》,作者: 夢想橡皮擦 。 本篇博客將學習壓縮 JS 代碼,首先要學習的模塊是 jsmin。 jsmin 庫 Python 中的 ...
摘要:Python Web程式員必看系列,學習如何壓縮 JS 代碼。
本文分享自華為雲社區《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()))
下圖可直觀查閱壓縮前與壓縮後的效果。
壓縮 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)
首次運行忽略代碼警告即可。
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())