Javascript代碼壓縮混淆工具terser詳解

原始的JavaScript代碼在正式的服務器上,如果沒有進行壓縮,混淆,不僅加載速度比較慢,而且還存在安全和性能問題. 因此現在需要進行壓縮,混淆處理. 處理方案簡單描述一下:

1. 使用 terser 工具進行

安裝 terser工具:

# npm 安裝
npm install terser --save-dev# 或使用 yarn 安裝
yarn add terser --dev

2. terser工具詳解

基本語法:

terser [input.js] [options] --output output.min.js

例如把 input.js 壓縮并輸出到 output.min.js:

terser input.js --compress --mangle --output output.min.js

3. 使用配置文件配置 Terser

Terser 支持將配置項放在單獨的配置文件中,便于管理。通常使用一個 JavaScript 文件(如:terser.config.js)進行配置. 我們可以創建一個名為 terser.config.js 的文件, 具體配置如下:

// terser.config.js
module.exports = {compress: {drop_console: true,   // 去除console.*語句drop_debugger: true,  // 去除debugger語句passes: 2,            // 多次壓縮迭代,效果更明顯unused: true,         // 刪除未使用的代碼dead_code: true,      // 刪除無效的代碼分支},mangle: {toplevel: true,       // 混淆頂級變量和函數名properties: false,    // 默認不混淆屬性名,避免破壞外部接口},output: {comments: false,      // 刪除所有注釋beautify: false,      // 不進行格式化排版,壓縮為一行},sourceMap: {filename: "output.min.js",url: "output.min.js.map"}
};

對于常用的配置項, 詳解如下:
compress 壓縮選項:

選項名說明推薦值
drop_console移除所有console.*語句true
drop_debugger移除所有debugger語句true
passes重復壓縮次數,數值越高效果越好2~3
unused刪除未使用的變量或函數true
dead_code刪除死代碼true

mangle 混淆選項:

選項名說明推薦值
toplevel混淆頂級函數和變量名true
properties是否混淆對象屬性名false(慎用
reserved不被混淆的變量或函數名(保留關鍵字)按需配置

output 輸出選項:

選項名說明推薦值
comments是否保留注釋false
beautify是否格式化輸出代碼false

sourceMap 源碼映射選項:
用于生成 source map 文件,便于調試

選項名說明
filename指定輸出js文件名
urlsource map 文件的名稱

4. 運行 Terser 配置文件

使用配置文件進行壓縮:

terser input.js --config-file terser.config.js --output output.min.js
  • –config-file 指定使用的配置文件。
  • –output 指定輸出文件路徑。

5. 在 npm scripts 中配置(推薦)

為了方便管理,建議你在項目的 package.json 中添加一個 npm script:

{"scripts": {"build:js": "terser src/input.js --config-file terser.config.js --output dist/output.min.js"}
}

然后執行:

npm run build:js

4. 與 Webpack 集成使用(可選)

如果你使用的是 webpack 項目,推薦使用 terser-webpack-plugin:

安裝插件:

npm install terser-webpack-plugin --save-dev

webpack 配置示例:

// webpack.config.js示例
const TerserPlugin = require('terser-webpack-plugin');module.exports = {//...optimization: {minimize: true,minimizer: [new TerserPlugin({terserOptions: require('./terser.config.js'),extractComments: false, // 不生成LICENSE文件}),],},
};
7. 調試與常見問題
  1. 如果代碼運行出錯,通常是因為mangle或compress配置過于激進,如properties:true可能會 破壞代碼。你可以逐步放寬選項排查問題。
  2. 建議始終開啟 sourceMap,方便快速定位問題代碼。
8. input.js 與 input.mini.js替換

我們生成了input.mini.js之后, 如何替換呢? 當然你可以手動替換,那樣可能會比較復雜,而且容出錯.我這邊直接是使用了自己寫的一個腳本

1. update_js_reference.sh

將html代碼中的 input.js替換成 input.mini.js, 代碼如下:

#!/bin/bash# 在所有HTML文件中將main.js引用更改為main-mini.js
find  -name "*.html" -type f -exec sed -i '' "s|/static/js/main.js|/static/js/main-mini.js|g" {} \;echo "已將所有HTML文件中的main.js引用更改為main-mini.js"
2. restore_js_reference.sh

將html代碼中的 input.mini.js復原成input.js, 用于繼續開發:

#!/bin/bash# 在所有HTML文件中將main-mini.js引用更改回main.js
find -name "*.html" -type f -exec sed -i '' "s|/static/js/main-mini.js|/static/js/main.js|g" {} \;echo "已將所有HTML文件中的main-mini.js引用更改回main.js"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76785.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java String 常用方法詳解

目錄 一、獲取字符串信息(一)獲取字符串長度(二)獲取指定索引處的字符(三)獲取子字符串二、字符串比較(一)比較字符串內容(二)忽略大小寫比較三、字符串轉換(一)轉換為大寫(二)轉換為小寫四、字符串查找(一)查找子字符串的位置(二)從指定位置開始查找五、字符…

Linux驅動開發練習案例

1 開發目標 1.1 架構圖 操作系統:基于Linux5.10.10源碼和STM32MP157開發板,完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪; 驅動層:為每個外設配置DTS并且單獨封裝外設驅動模塊。其中電壓ADC測試,采用linux內核…

leetcode-代碼隨想錄-哈希表-贖金信

題目 題目鏈接:383. 贖金信 - 力扣(LeetCode) 給你兩個字符串:ransomNote 和 magazine ,判斷 ransomNote 能不能由 magazine 里面的字符構成。 如果可以,返回 true ;否則返回 false 。 maga…

精品可編輯PPT | “新基建”在數字化智慧高速公路中的支撐應用方案智慧建筑智慧交通解決方案施工行業解決方案

本文詳細闡述了“新基建”在數字化智慧高速公路中的支撐應用方案,從政策背景出發,指出國家在交通領域的一系列發展規劃和指導意見,強調了智慧交通建設的重要性。分析了當前高速公路存在的問題,如基礎感知設施不足、協同水平低、服…

C語言求3到100之間的素數

一、代碼展示 二、運行結果 三、感悟思考 注意: 這個題思路他是一個試除法的一個思路 先進入一個for循環 遍歷3到100之間的數字 第二個for循環則是 判斷他不是素數 那么就直接退出 這里用break 是素數就打印出來 在第一個for循環內 第二個for循環外

英語—四級CET4考試—蒙猜篇—匹配題

蒙猜方法一 匹配題的做題: 方法一: 首先,什么都不想,把問題中ing形式的,大寫字母的,人名,地名,最后幾個依次框起來。 然后,比如46題,口里默念meaningful lif…

股票日數據使用_未復權日數據生成前復權日周月季年數據

目錄 前置: 準備 代碼:數據庫交互部分 代碼:生成前復權 日、周、月、季、年數據 前置: 1 未復權日數據獲取,請查看 https://blog.csdn.net/m0_37967652/article/details/146435589 數據庫使用PostgreSQL。更新日…

系統與網絡安全------Windows系統安全(6)

資料整理于網絡資料、書本資料、AI,僅供個人學習參考。 共享文件夾 發布共享文件夾 Windows共享概述 微軟公司推出的網絡文件/打印機服務系統 可以將一臺主機的資源發布給其他主機共有 共享訪問的優點 方便、快捷相比光盤 U盤不易受文件大小限制 可以實現訪問…

BN 層的作用, 為什么有這個作用?

BN 層(Batch Normalization)——這是深度神經網絡中非常重要的一環,它大大改善了網絡的訓練速度、穩定性和收斂效果。 🧠 一句話理解 BN 層的作用: Batch Normalization(批歸一化)通過標準化每一…

判斷HiveQL語句為ALTER TABLE語句的識別函數

寫一個C#字符串解析程序代碼,邏輯是從前到后一個一個讀取字符,遇到匹配空格、Tab和換行符就繼續讀取下一個字符,遇到大寫或小寫的字符a,就讀取后一個字符并匹配是否為大寫或小寫的字符l,以此類推,匹配任意字…

基于編程的運輸設備管理系統設計(vue+springboot+ssm+mysql8.x)

基于編程的運輸設備管理系統設計(vuespringbootssmmysql8.x) 運輸設備信息管理系統是一個全面的設備管理平臺,旨在優化設備管理流程,提高運輸效率。系統提供登錄入口,確保只有授權用戶可以訪問。個人中心讓用戶可以查…

6.1 python加載win32或者C#的dll的方法

python很方便的可以加載win32的方法以及C#編寫的dll中的方法或者變量,大致過程如下。 一.python加載win32的方法,使用win32api 1.安裝庫win32api pip install win32api 2.加載所需的win32函數并且調用 import win32api win32api.MessageBox(0,"…

前端精度計算:Decimal.js 基本用法與詳解

一、Decimal.js 簡介 decimal.js 是一個用于任意精度算術運算的 JavaScript 庫,它可以完美解決浮點數計算中的精度丟失問題。 官方API文檔:Decimal.js 特性: 任意精度計算:支持大數、小數的高精度運算。 鏈式調用:…

SQL Server 數據庫實驗報告

??????? 1.1 實驗題目:索引和數據完整性的使用 1.2 實驗目的: (1)掌握SQL Server的資源管理器界面應用; (2)掌握索引的使用; (3)掌握數據完整性的…

AI繪畫中的LoRa是什么?

Lora是一個多義詞,根據不同的上下文可以指代多種事物。以下將詳細介紹幾種主要的含義: LoRa技術 LoRa(Long Range Radio)是一種低功耗廣域網(LPWAN)無線通信技術,以其遠距離、低功耗和低成本的特…

哈希表(Hashtable)核心知識點詳解

1. 基本概念 定義:通過鍵(Key)直接訪問值(Value)的數據結構,基于哈希函數將鍵映射到存儲位置。 核心操作: put(key, value):插入鍵值對 get(key):獲取鍵對應的值 remo…

數據流和重定向

1、數據流 不管正確或錯誤的數據都是默認輸出到屏幕上,所以屏幕是混亂的。所以就需要用數據流重定向將這兩 條數據分開。數據流重定向可以將標準輸出和標準錯誤輸出分別傳送到其他的文件或設備去 標準輸入(standard input,簡稱stdin&#xff…

詳解 MySQL 索引的最左前綴匹配原則

MySQL 的最左前綴匹配原則主要是針對復合索引(也稱為聯合索引)而言的。其核心思想是:只有查詢條件中包含索引最左側(第一列)開始的連續一段列,才能讓 MySQL 有效地利用該索引。 一、 復合索引的結構 復合…

MyBatis注解開發增刪改查基礎篇

本文是MyBatis注解開發的基礎篇,將通過實際場景,詳細介紹MyBatis注解式開發的使用,這是MyBatis很強大的一個特性,可以直接在接口方法上定義 SQL 語句,從而實現數據庫的增刪改查操作。 本文目錄 一、環境依賴二、創建對…

周末總結(2024/04/05)

工作 人際關系核心實踐: 要學會隨時回應別人的善意,執行時間控制在5分鐘以內 堅持每天早會打招呼 遇到接不住的話題時拉低自己,抬高別人(無陰陽氣息) 朋友圈點贊控制在5min以內,職場社交不要放在5min以外 職場的人際關系在面對利…