webpack打包後不能調用,改用uglifyjs打包壓縮

来源:https://www.cnblogs.com/weichenzhiyi/archive/2020/01/17/12206809.html
-Advertisement-
Play Games

背景: 項目基於原生js,沒用到任何腳手架和框架,但也需要打包壓縮。 項目的js中聲明瞭一些全局變數 供其他js調用。 這時候如果用webpack打包,基於webpack特性,會嵌套一層大函數,會將js中的變數變成局部,不能供其他js調用。 因此棄用了webpack。選用了uglifyjs。 原因: ...


背景:

項目基於原生js,沒用到任何腳手架和框架,但也需要打包壓縮。

項目的js中聲明瞭一些全局變數 供其他js調用。

這時候如果用webpack打包,基於webpack特性,會嵌套一層大函數,會將js中的變數變成局部,不能供其他js調用。 

因此棄用了webpack。選用了uglifyjs。

原因:

webpack里也有用到uglifyjs的webpack版:uglifyjs-webpack-plugin。

打包途徑:

打包源文件:dev文件夾下的js文件====>目標文件:js文件夾。

目錄結構

 

 

 

使用:

1、如果是es5 使用uglify-js 官網的預設分支就是這個。

2、如果是es6 使用uglify-es 官網的harmony分支 下載下來就是uglify-es。

uglifyjs官網:https://github.com/mishoo/UglifyJS2

步驟:

首先確認自己電腦有沒有安裝node,這是用node啟動的。

 

1、下載uglifyjs 這裡我下載的是es版。

npm install uglify-es -D

2、寫一個package.json,下麵的package.json可以下載下來 直接npm i 就省略了第一步了。

scripts裡面是我寫的命令

我想在development下打包後也能調試 用到了sourceMap(映射),

在production下打包壓縮。

我的入口文件 起名了entry.js

{
  "name": "ocplayermin",
  "version": "1.0.0",
  "description": "ocplayer min version",
  "main": "entry.js",
  "scripts": {
    "build_min": "NODE_ENV=production node entry.js --progress",
    "build_min_dev": "NODE_ENV=development node entry.js --progress"
  },
  "keywords": [],
  "author": "",
  "license": "MIT",
  "dependencies": {},
  "devDependencies": {
    "uglify-es": "^3.3.9",
    "uglify-js": "^3.7.4"
  }
}

 

註意:NODE_ENV在windows下不相容 需要安裝cross-env插件:npm install cross-env --save-dev

安裝完 在 build_min 和 build_min_dev後加上 cross-env 就可以。

 

 

3、entry.js代碼

打算把dev文件下的js文件打包到js文件中。

代碼邏輯:

  • 1、遍歷dev文件夾下的所有js文件,獲取到文件名和舊路徑。
  • 2、生成js文件夾,如果沒有js文件夾 則創建,生成新文件的路徑。
  • 3、development下 用UglifyJS.minify壓縮生成sourceMap文件。
  • 4、production下 由於development環境下生成了.js.map文件,這裡刪除.js.map,生成.js文件。

遇到的問題:

由於在瀏覽器讀取時,映射 source map讀取的文件需要和js是同一個目錄 因此需要將前端的埠路徑,賦值到.js.map。

例如:地址:127.0.0.1:5500/minversion/index.html;

推薦一款好用的編輯器(用vcode編輯器的open with live server啟動項目,預設埠5500)

讀取前端js路徑:127.0.0.1:5500/minversion/js/xxx.js;

映射生成的路徑也得是127.0.0.1:5500/minversion/js/xxx.js.map;如果是'./js/xxx.js.map'是讀取不到的。

我新建了一個config.json 專門存取常量,我將前端的埠寫在這裡 聲明為:PLUGIN_URL只要修改這個,entry.js就能讀取到。

對source map 不太知道的 可以看官網文檔。

config.json

{"pluginUrl":"http://127.0.0.1:5500/minversion"}

entry.js

const path = require('path');
const fs=require('fs');

const UglifyJS = require("uglify-es");//相容es6
//var UglifyJS = require("uglify-js");//es5
const ORIGIN_PATH='/dev';
const ORIGIN_DIR = '.'+ORIGIN_PATH; // 原目錄
const DESTINATION_PATH='/js';
const DESTINATION_DIR = '.'+DESTINATION_PATH;//打包後的目錄
var PLUGIN_URL="";/*地址*/
PLUGIN_URL=JSON.parse(fs.readFileSync('./config.json','utf-8')).pluginUrl;

//  遍歷目錄得到文件信息
function getPath(_path, callback) {
    let files = fs.readdirSync(_path);
    files.forEach(function(file){
        //判斷文件是否存在
        if (fs.statSync(_path + '/' + file).isFile()) {
            callback(_path, file);
        }
    });
}
//生成壓縮後的文件
function buildMin (callback) {
    /*如果不存在min 就會創建min文件夾*/
    if ( !fs.existsSync(DESTINATION_DIR) ) {
        fs.mkdirSync(DESTINATION_DIR);
    } 
    // 運行
    getPath(ORIGIN_DIR, function (_path, file) {
        let fileName = file.match(/(\S+)(\.\S+)$/)[1]; // 獲得文件名
 
        let oldPath = _path + '/' + file, // 原路徑
            newPath = DESTINATION_PATH + '/' + fileName+'.js'; // 新路徑 到不了.js
            
         const _code = fs.readFileSync(oldPath, 'utf-8');
         callback(newPath,fileName,_code)
         
    });
}
//刪除文件
function deleteFile(delPath, direct) {
    delPath = direct ? delPath : path.join(__dirname, delPath)
    try {
        /**
         * @des 判斷文件或文件夾是否存在
         */
        if (fs.existsSync(delPath)) {
            fs.unlinkSync(delPath);
        } else {
            console.log('inexistence path:', delPath);
        }
    } catch (error) {
        console.log('del error', error);
    }
}

if (process.env.NODE_ENV === 'production') {
    /*生產環境*/
    getPath(DESTINATION_DIR, function (_path, file) {
        //刪除.map文件
        if(file.indexOf('.js.map')>-1){
            let delp = _path+'/'+file;
            deleteFile(delp)
        }      
    })
  //打包 buildMin(function(newPath,fileName,_code){ const minCode = UglifyJS.minify(_code,{ compress:{pure_funcs:'console.log'} }).code; fs.writeFileSync('.'+newPath, minCode); }); } if (process.env.NODE_ENV === 'development') { /*開發環境*/
  //打包 buildMin(function(newPath,fileName,_code){ var _codeFname = "."+newPath; var _code_file={}; _code_file[_codeFname]=_code; const _minObj = UglifyJS.minify(_code_file,{ sourceMap: { filename:fileName+'.js', url:PLUGIN_URL+newPath+".map",//生成的就是127.0.0.1:5500/minversion/js/xxx.js.map includeSources:PLUGIN_URL+newPath+".map", }, keep_fnames:true, warnings: true, }); fs.writeFileSync('.'+newPath, _minObj.code); fs.writeFileSync('.'+newPath+'.map', _minObj.map); }); }

  

  至此就打包成功啦,可以複製到自己項目中試一下。記得將源文件夾、目標文件夾改成你的項目路徑,還有PLUGIN_URL。


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

-Advertisement-
Play Games
更多相關文章
  • 今天測試Linux 各個軟體源 ,發現mysql 配置官方源之後,yum install -y mysql 安裝了 mysql lastst 最新版, 安裝完之後,奇葩的是沒有提示輸入密碼, 所以 mysql 可以進入 提示輸入密碼,沒有密碼, 再經過幾個折騰,包括什麼跳過密碼驗證等等方法試過之後還 ...
  • 先上GitHub地址:Hugo 一句話描述該框架,以Log的形式告訴我們某個方法傳入的每一個參數以及返回值,以及調用的activity 時間 等其他信息 非常適用方便代碼調試 引入框架: 根目錄下的build.gradle app下的build.gradle 使用方法: 在class前或是方法前加上 ...
  • 1.SQLite介紹 SQLite,是一款輕型的資料庫,它的優缺點有如下: 輕量級,適合嵌入式設備,並且本身不依賴第三方的軟體,使用它也不需要“安裝”。 併發(包括多進程和多線程)讀寫方面的性能不太理想。可能會被寫操作獨占,從而導致其它讀寫操作阻塞或出錯 2.SQLiteOpenHelper介紹 為 ...
  • 0.效果演示 插入視頻插不進來,就很煩。可以出門右拐去優酷看下(點我!)。 1.準備工作 1.1前端框架 前端使用了基於vue.js的nuxt.js。為什麼使用nuxt.js? 首先我做的是博客的項目,所以SSR至關重要。雖然跟本文要講的登錄註冊沒有什麼關係,但是文章如果用axios來非同步獲取的話, ...
  • 今天設置了Bootstrap Table的複雜表頭,設置了多級表頭(兩行列名),但是只能顯示第一級表頭(第一行的列名),第二級的表頭被第一級的表頭覆蓋。但是我仿照其他網上的其他設置複雜表頭例子都能正常顯示,我的設置了多級表頭怎麼就不能正常展示呢?我真的十分鬱悶,後經過思考和查找資料,需要在頁面加上這 ...
  • 寫著寫著,就會跑偏,沒錯又走上了一個岔道……就是不知道這條岔道以後會不會越來越寬,有的說他是未來,有的說…… 這裡不知道,也不做什麼評斷。減少一些重覆性的工作,提高開發效率這是最根本的。說白了就是偷懶唄!又說了一大堆廢話。接觸過angularjs、vue還有一點點的reactjs,組件化的思想給開發 ...
  • 文本陰影介紹 在 中使用 屬性設置文本陰影,該屬性一共有 個屬性值如:水平陰影、垂直陰影、(清晰度或模糊距離)、陰影顏色。 屬性值說明,在文本陰影實踐中:第一個值是設置陰影水平方向移動,第二個值是設置陰影垂直方向移動,第三個值是設置陰影模糊距離,第四個值是設置陰影顏色。 屬性值可以設置為負數。 文本 ...
  • 音樂導航 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> * { margin: 0; padding: 0; list-style: none; } .nav { ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...