js 壓縮
阿新 • • 發佈:2018-08-24
fields ase document art NPU eat express 接收 元素
聽到同事說沒找到壓縮js文件的,說軟件壓縮貌似有點問題,我自己就用nodejs練手般寫了壓縮文件的。
主要的思路就是,先通過前端上傳js文件,然後服務器接收,然後引用uglifyjs 壓縮,再返回文件路徑給前端下載即可。代碼如下:
html:
<div> <div class="content"> <span>js壓縮工具</span> <form id="uploadFiles" enctype="multipart/form-data"> <input type="file" id=‘uglifyJs‘ multiple="multiple" name="js_min"> <input type="hidden" name="test" value="heyden"> </form> <button id="upload">壓縮</button> </div> </div>
js 腳本
$(function() { var baseUrl = location.hostname $("#upload").click(function() { $.ajax({ url:`http://${baseUrl}:8084/upload`, type:‘POST‘, data: new FormData($(‘#uploadFiles‘)[0]), processData:false, contentType:false, success: function(res) { res.fileData.forEach(item=> { let elDown = document.createElement(‘a‘), e = document.createEvent("MouseEvents"); //創建鼠標事件對象 e.initEvent("click", false, false); //初始化事件對象 elDown.href = item.downUrl elDown.download = item.fileName; elDown.dispatchEvent(e); //給指定的元素,執行事件click事件 }); }, error: function() { } }) }) })
這裏ajax請求時。processData,contentType這兩個記得填,否則會被坑
nodejs :
const express = require(‘express‘); const app = express() const formidable = require(‘formidable‘); const fs = require(‘fs‘) const path = require(‘path‘) const UglifyJS = require(‘uglify-js‘) const multiparty = require(‘multiparty‘); let form = null app.use(express.static(‘static‘)) app.get(‘/‘, function(req, res) { res.sendfile(‘index.html‘) }) app.post(‘/upload‘, function(req, res) { form = new multiparty.Form(); form.uploadDir = ‘static/tmp‘ form.maxFieldsSize = 1 * 1024 * 1024; var targetDir = path.join(__dirname, ‘/static/upload‘) fs.access(targetDir, function (err) { if (err) { fs.mkdir(targetDir); } _fileSave(req, res, targetDir) }) }) app.listen(8084, "0.0.0.0" ,() => { console.log(‘succcess in port 8084‘); }) function _fileSave(req, res, target) { form.parse(req, function (err, fields, files) { if (err) throw err var fileData = []; var errCount = 0; var keys = files.js_min var miniJs = [] keys.forEach(function(key, index) { var filePath = key.path; var fileExt = filePath.substring(filePath.lastIndexOf(‘.‘)); if ((‘.js.txt‘).indexOf(fileExt.toLowerCase()) === -1) { errCount += 1; } else { var fileName = fileExt; var targetFile = target + ‘/‘ + key.originalFilename ; var fileUrl = req.originalUrl +"/"+ key.originalFilename //移動文件 miniJs.push(UglifyJS.minify(fs.readFileSync(filePath, ‘utf8‘))) fs.writeFileSync(targetFile, miniJs[index].code, "utf8") fs.unlinkSync(filePath); // 文件的Url(相對路徑) fileData.push({ target: targetFile, downUrl: fileUrl, fileName: key.originalFilename}) } }) res.json({ fileData: fileData, success: keys.length - errCount, error: errCount, result: miniJs}); }) }
寫服務時,接收前端的文件時,調接口時,form 對象記得調一次就new一個,否則會報錯。,,獲取前端文件後,只需用UglifyJS處理,然後重命名臨時文件即可,最後返回
文件url給前端,讓前端自己下載。這裏我也不知道怎麽直接讓前端自動下載,貌似通過請求不好下載,自己也沒找到方法,求靠前端js解決咯
js 壓縮