webpack 混淆壓縮后端代碼

需求背景

JavaScript 是腳本語言, 沒有編譯過程, 直接以源碼就可以運(yùn)行. 有的時(shí)候, 出于安全或者其他的原因, 我們不希望別人直接讀到源碼, 或者很容易對源碼做出修改使用. 這個(gè)時(shí)候, 就需要對源碼進(jìn)行混淆壓縮處理. 經(jīng)過處理后的代碼體積變小, 不再可讀. 本篇介紹利用 webpack 打包工具來完成對后端代碼的混淆壓縮.

安裝配置 webpack

  • 安裝
npm i babel-core babel-loader babel-polyfill babel-preset-es2015 babel-preset-stage-2 webpack -D
  • 配置
const webpack = require('webpack');
const path = require('path');

function resolve(dir) {
    return path.resolve(__dirname, dir);
}

module.exports = {
    entry: {
        app: ['babel-polyfill', './app.js'],
    },
    target: 'node',
    output: {
        path: __dirname,
        filename: '[name].min.js'
    },
    resolve: {
        modules: [".", "node_modules"],
        extensions: ['.js'],
        alias: {
            "cfg": resolve("cfg.js")
        }
    },
    externals: function () {
        let manifest = require('./package.json');
        let dependencies = manifest.dependencies;
        let externals = {};
        for (let p in dependencies) {
            externals[p] = 'commonjs ' + p;
        }
        externals["cfg"] = "commonjs cfg";
        return externals;
    }(),
    node: {
        console: true,
        global: true,
        process: true,
        Buffer: true,
        __filename: true,
        __dirname: true,
        setImmediate: true
    },
    module: {
        loaders: [
            {
                test: /\.js$/,
                loader: 'babel-loader',
                exclude: /node_modules/
            }
        ]
    }
};

if (process.env.NODE_ENV === 'production') {
    module.exports.plugins = (module.exports.plugins || []).concat([new webpack.optimize.UglifyJsPlugin({
        minimize: true,
        compress: false
    })]);
}

  • 配置說明

上面的 webpack 配置將會(huì)把 app.js 和它的依賴源碼混淆壓縮到一個(gè)文件app.min.js當(dāng)中.

通過 externals 屬性告訴 webpack 在打包的時(shí)候不要打包 node_modules 目錄下面的代碼, 也不要將程序的配置文件 cfg.js 一起打包, 因?yàn)?node_modules 目錄可以根據(jù) package.json 安裝生成, 而 cfg.js 是留給用戶自定義配置用的, 如果一起打包到 app.min.js 就不方便編輯了, 所以這兩項(xiàng)都排除了.

但是這里排除打包 cfg.js 有個(gè)問題需要解決. 我們只指定了對 cfg 字樣的模塊進(jìn)行排除, 也就是說, 在源碼里面, 凡是要引用 cfg.js 的地方, 我們都不能按照相對路徑來寫, 比如 require('./cfg.js'), 如果這樣寫, 那么 cfg.js 還是會(huì)打包到最終的文件里在. 正確的寫法是 require('cfg'). 這就要求把 NODE_PATH 指向當(dāng)前源碼的根目錄.

為了方便指定 NODE_PATH, 我們可以安裝 cross-env 組件

npm i cross-env -D

接下來, 如果你之前以 node app.js 這種方式運(yùn)行程序, 那么現(xiàn)在改為這樣 cross-env NODE_PATH=. node app.js

還有一個(gè)小問題, 我這里使用 vscode, 來做 JS 開發(fā) IDE, 當(dāng)以相對路徑引用庫文件的時(shí)候, vscode 能夠提供很好的編碼提示. 但是以指定 NODE_PATH 的方式引用文件時(shí), vscode 不能提示. 為了讓 vscode 知道 NODE_PATH 所在, 我們可以在源碼根目錄下新建一個(gè)配置文件來解決, jsconfig.json

{
    "compilerOptions": {
        "target": "ES6",
        "baseUrl": "."
    }
}

打包

cross-env NODE_ENV=production NODE_PATH=. webpack --progress --hide-modules
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疲吸,一起剝皮案震驚了整個(gè)濱河市限佩,隨后出現(xiàn)的幾起案子旺芽,更是在濱河造成了極大的恐慌馋嗜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩稽,死亡現(xiàn)場離奇詭異惧笛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逞泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門患整,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喷众,你說我怎么就攤上這事各谚。” “怎么了到千?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵昌渤,是天一觀的道長。 經(jīng)常有香客問我憔四,道長膀息,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任了赵,我火速辦了婚禮潜支,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柿汛。我一直安慰自己毁腿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布苛茂。 她就那樣靜靜地躺著已烤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妓羊。 梳的紋絲不亂的頭發(fā)上胯究,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音躁绸,去河邊找鬼裕循。 笑死,一個(gè)胖子當(dāng)著我的面吹牛净刮,可吹牛的內(nèi)容都是我干的剥哑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼淹父,長吁一口氣:“原來是場噩夢啊……” “哼株婴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤困介,失蹤者是張志新(化名)和其女友劉穎大审,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體座哩,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徒扶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了根穷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姜骡。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屿良,靈堂內(nèi)的尸體忽然破棺而出圈澈,到底是詐尸還是另有隱情,我是刑警寧澤管引,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布士败,位于F島的核電站闯两,受9級特大地震影響褥伴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漾狼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一重慢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逊躁,春花似錦似踱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酵熙,卻和暖如春轧简,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匾二。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工哮独, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人察藐。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓皮璧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親分飞。 傳聞我的和親對象是個(gè)殘疾皇子悴务,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • GitChat技術(shù)雜談 前言 本文較長,為了節(jié)省你的閱讀時(shí)間譬猫,在文前列寫作思路如下: 什么是 webpack惨寿,它要...
    蕭玄辭閱讀 12,681評論 7 110
  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺邦泄,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,147評論 7 35
  • webpack 介紹 webpack 是什么 為什么引入新的打包工具 webpack 核心思想 webpack 安...
    yxsGert閱讀 6,460評論 2 71
  • 目錄第1章 webpack簡介 11.1 webpack是什么裂垦? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,731評論 0 1
  • 上有老蕉拢, 一個(gè)老年癡呆的婆婆特碳, 每天不是“搗蛋”就是“發(fā)瘋”。 下有小晕换, 一對不成熟的兒女午乓, 姐姐跟著已婚男偷情,...
    瑪奇朵828閱讀 473評論 0 0