前端項目代碼加密教程

来源:https://www.cnblogs.com/fengyumeng/archive/2019/06/24/11072076.html
-Advertisement-
Play Games

序 我們都知道,瀏覽器上是可以看到前端的html和js代碼的,所以如果遇到隱私心比較強的老闆,你就冷不丁的會接受到一個代碼加密的需求,當接受到這個需求的時候你怎麼完成?那我希望我的這篇博客可以幫助到你。 為了保證本篇教程真實可用,我將使用一臺新的Windows系統,從無到有進行演示,同時將操作流程記 ...


  我們都知道,瀏覽器上是可以看到前端的html和js代碼的,所以如果遇到隱私心比較強的老闆,你就冷不丁的會接受到一個代碼加密的需求,當接受到這個需求的時候你怎麼完成?那我希望我的這篇博客可以幫助到你。

  首先,告訴你的老闆,嚴格意義上的加密是不存在的,能夠實現的只有對前端代碼進行壓縮混淆,增加閱讀難度。

  本篇教程全篇描述的,就是對代碼進行混淆的手段,從而滿足老闆提出的加密需求。

  為了保證本篇教程真實可用,我將使用一臺新的Windows系統,從無到有進行演示,同時將操作流程記錄在這裡,供你參考,也希望能夠幫你跳過一些坑,如果你遇到什麼問題,請留言討論。

 

安裝NodeJs

  如果你沒安裝過node,請跟著教程走,如果你安裝過,請直接跳到下一節。

  下載地址:http://nodejs.cn/download/

 

  直接下載安裝,安裝的過程是傻瓜式的下一步,唯一可以改變的是安裝位置。

 

  安裝完成後打開cmd命令行,查看版本號是為了確認是否安裝成功。

  

 

安裝插件

  切換到項目根目錄:

  

 

  安裝gulp插件包:npm install --save-dev gulp

  效果如圖:

  

 

  別急,還有很多包,命令一條一條刷起來:

 

  npm install --save-dev del

  npm install --save-dev gulp-concat

  npm install --save-dev gulp-header

  npm install --save-dev gulp-if

  npm install --save-dev gulp-minify-css

  npm install --save-dev gulp-htmlmin

  npm install --save-dev gulp-rename

  npm install --save-dev gulp-replace

  npm install --save-dev gulp-uglify

  npm install --save-dev gulp-babel

  npm install --save-dev babel-preset-es2015

  npm install --save-dev @babel/core

  npm install --save-dev @babel/preset-env

 

註意事項

  插件安裝完成後,我們的前期工作就做完了。

  我們會發現項目目錄中多個一個node_modules目錄和package-lock.json文件,json文件中是我們的插件列表,node_modules目錄中是我們安裝的插件包。

  

  index.html是我的主入口文件,src目錄就是我的項目中存放代碼的目錄,也就是我要壓縮加密構建的目錄。

 

  

  src里有三個子目錄,controller存放獨立的js處理前端業務邏輯,style存放css樣式文件,view存放html頁面。

 

  在編寫腳本之前,我需要直白的告訴你,如果你的JS里有ES6語法,正常打包是打不了的,不過我們的前期工作已經把處理這個問題的工具包也一起安裝了,但是也僅限於處理單獨的JS文件。

  如果你是HTML代碼里嵌JS,並且JS里有ES6語法,那麼需要把JS代碼拎出來做成單獨的JS,或者手動將ES6寫法改成ES5。

 

  總之,如果你打包報錯,很大可能是ES6語法導致,其次是文件路徑錯誤。

 

壓縮JS

  回到我們的項目根目錄,創建一個gulpfile.js文件,這個是固定的文件名:

  

引入包:

var gulp = require('gulp');
var uglify = require('gulp-uglify');
var babel = require('gulp-babel');
var minifyCss = require("gulp-minify-css");
var htmlmin = require('gulp-htmlmin');
var header = require('gulp-header');
var del = require('del');

 

定義一個目標目錄:

var destDir = './dist';

 

定義一個註釋,因為我希望在壓縮後的代碼中第一行添加一點註釋:

var note = ['/**  小樣,看源碼?想得美! */\n <%= js %>', {js: ';'}];

 

監聽任務:

gulp.task('minjs', function () {
    //定義路徑
    var src = [
        './src/**/*.js'
    ];
    gulp.src(src)
        .pipe(babel({presets: ["@babel/env"], plugins: []}))//es6轉es5
        .pipe(uglify())//壓縮
        .pipe(header.apply(null, note))//添加頭部註釋
        .pipe(gulp.dest(destDir));//將壓縮後的內容輸出到目標目錄
});

  minjs就是我們自定義的任務名,也就是說 我們在命令行輸入gulp minjs 這行命令,這段代碼就會執行。

  如果只輸入gulp命令,它會自動去找名為default的任務。

 

  var src = ['./src/**/*.js']; 就是我們想要抓取的文件,使用了通配符,你幾乎一定會有需求像下麵這樣寫:

var src = [
        './src/**/*.js'
        , '!./src/config.js'
        , '!./src/lib/extend/*.js'
    ];

  感嘆號的意思是排除。

 

  這裡說明一下destDir只會代替通配符之前的目錄路徑,比如說我這裡的destDir定義的是./dist,那麼 ./src/controller/admin.js 壓縮後的路徑就是 ./dist/controller/admin.js。

 

  好了,打開命令行,輸入命令:gulp minjs

  

 

 

  查看項目,js文件已經壓縮成功了。

 

壓縮CSS

  任務的監聽和壓縮JS是沒有差別的,只不過壓縮任務用gulp-minify-css插件來完成。

gulp.task('mincss', function () {
    var src = [
        './src/style/*.css'
    ];
    gulp.src(src).pipe(minifyCss()).pipe(gulp.dest(destDir + '/style'));
});

 

  輸入命令:gulp mincss

  

 

  查看項目也沒有任何問題:

  非常智能的它會把css中的註釋給你刪掉。

 

壓縮HTML

  壓縮HTML可以傳入很多參數指定相應的行為:

gulp.task('minhtml', function () {
    var options = {
        removeComments: true,//清除HTML註釋
        collapseWhitespace: true,//摺疊空白
        minifyJS: true,//壓縮頁面JS
        minifyCSS: true//壓縮頁面CSS
    };
    var src = [
        './src/views/**/*',
    ];
    gulp.src(src)
        .pipe(htmlmin(options))
        .pipe(gulp.dest(destDir + '/views'));
});

  更多參數請移步這裡來看:https://github.com/kangax/html-minifier/blob/gh-pages/README.md

 

  輸入命令:gulp minhtml

  

 

 

  壓縮後的HTML:

 

  全部壓成一行,文件中的css和js也一併壓縮了。

 

一條龍處理

  但是我們總不可能是打個包要跑多條命令吧,那多麻煩,現在我們就整合整合,讓這些任務合併成一個任務。

  我們創建一個task對象,把各個任務的內容放進去,並且加一個清理dist目錄的方法,和一個move方法負責將沒有被壓縮的文件複製過去。

//任務列表
var task = {
    //清理dist目錄
    clear:function () {
        del(['./dist/*']);
    },
    minjs:function () {
        //定義路徑
        var src = [
            './src/**/*.js'
        ];
        gulp.src(src)
            .pipe(babel({presets: ["@babel/env"], plugins: []}))//es6轉es5
            .pipe(uglify())//壓縮
            .pipe(header.apply(null, note))//添加頭部註釋
            .pipe(gulp.dest(destDir));
    },
    mincss:function () {
        var src = [
            './src/style/*.css'
        ];
        gulp.src(src).pipe(minifyCss()).pipe(gulp.dest(destDir + '/style'));
    },
    minhtml:function () {
        var options = {
            removeComments: true,//清除HTML註釋
            collapseWhitespace: true,//摺疊空白
            minifyJS: true,//壓縮頁面JS  如果你確信你的HTML頁面中的js不包含有es6語法,那麼可以壓縮js 否則還是得把js抽離成單獨的文件進行壓縮
            minifyCSS: true//壓縮頁面CSS
        };
        var src = [
            './src/**/*',
        ];
        gulp.src(src)
            .pipe(htmlmin(options))
            .pipe(gulp.dest(destDir));
    },
    move: function () {
        //複製文件夾  沒有被壓縮的文件就在這裡複製
        gulp.src('./src/**/*.png').pipe(gulp.dest(destDir));
    }
};

 

  我們在壓縮js的時候說了,如果只是gulp命令,它會去找名為default的任務,我們就在default任務里遍歷task對象,將其中的方法輪流執行一遍。

gulp.task('default', function () {
    for (var key in task) {
        task[key]();
    }
});

  這樣,我們只需要一個gulp命令,也就走完了整個構建流程。

 

  同時,我們將單個的任務指向task中對應的方法:

gulp.task('clear',task.clear);
gulp.task('minjs',task.minjs);
gulp.task('mincss',task.mincss);
gulp.task('minhtml',task.minhtml);
gulp.task('move',task.move);

 

  無論是單獨處理一個環節,還是整個構建流程,我們都可以很方便的完成。

 

最後,感謝閱讀。  PS:歡迎關註,有粉必回。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DDL DDL是DBMS的核心組件,是SQL的重要組成部分. DDL的正確性和穩定性是整個SQL髮型的重要基礎. DDL的基礎語法及設計工具 DDL的英文是Data Definition Language,也就是數據定義語言.定義了資料庫的結構和數據表的結構.常用的功能急救室增刪改,對應的命令分別是 ...
  • Redis目錄分析 Windows版的配置文件是redis.windows.conf,LInux版的配置文件redis.conf。 伺服器端命令 安裝服務: redis-server --service-install D:\Redis-x64-3.2.100\redis.windows.conf ...
  • 緩存命中率的介紹 命中:可以直接通過緩存獲取到需要的數據。 不命中:無法直接通過緩存獲取到想要的數據,需要再次查詢資料庫或者執行其它的操作。原因可能是由於緩存中根本不存在,或者緩存已經過期。 通常來講,緩存的命中率越高則表示使用緩存的收益越高,應用的性能越好(響應時間越短、吞吐量越高),抗併發的能力 ...
  • MySql報錯 [toc] 1. 1062 duplicate entry '0' for key 'xxx' 1.1 報錯場景 在建立索引的時候報此錯誤。 1.2 報錯原因 索引或者主鍵有重覆鍵 1.3 解決方法 刪除重覆的索引或者主鍵條目,即可。 1.4 具體舉例 給MAC建立索引表的時候,會報 ...
  • show命令 show 命令可以提供關於資料庫、表、列,或關於伺服器的狀態信息。 總結 實例 顯示建表建庫語句 sql mysql SHOW DATABASES; + + | Database | + + | information_schema | | mysql | | performance_ ...
  • -- 通配符進行過濾 #使用條件是只能用於文本欄位(字元串),非文本數據類型欄位不能使用通配符搜索 -- LIKE操作符/* 當過濾中使用的值都是已知的時候可以不用通配符,但是當數據量很大 需要進行搜索特定條件的值,簡單的比較操作符肯定不行,這時候利用通配符,可以創建比較特定數據的搜索模式。什麼是通 ...
  • 當下,大數據方面的就業主要有三大方向:一是數據分析類大數據人才,二是系統研發類大數據人才,三是應用開發類大數據人才。 ...
  • 一、高可用簡介 二、集群規劃 三、前置條件 四、集群配置 五、啟動集群 六、查看集群 七、集群的二次啟動 一、高可用簡介 Hadoop 高可用 (High Availability) 分為 HDFS 高可用和 YARN 高可用,兩者的實現基本類似,但 HDFS NameNode 對數據存儲及其一致性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...