js 压缩
听到同事说没找到压缩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 压缩的更多相关文章
- 【DWR系列06】- DWR日志及js压缩
img { border: solid 1px } 一.日志 DWR依赖 Apache Commons Logging,可以使用log4j实现日志记录功能. 1.1 日志简介 和其他日志框架一样,当设 ...
- 26、ASP.NET MVC入门到精通——后台管理区域及分离、Js压缩、css、jquery扩展
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做准备,由于许久没有练习双截棍了,难免生疏,所以现在临时抱 ...
- js压缩图片base64长度
var myCanvas=$('.img-container > img').cropper('getCroppedCanvas'); (function (base64){ var image ...
- gulp-uglify《JS压缩》----gulp系列(四)
本节实现JS压缩,在实现压缩前,先配置JS任务,设置源目录和输出目录. 在系列(三)代码的基础上,再进行扩展. 1.找到gulp->config.js,对JS进行源目录(src->img) ...
- js压缩、混淆和加密
最近看到有些论坛在讨论js压缩.混淆和加密的问题,特意找了些资料看了下,现在总结一下: 1.关于三者的定义与区别 压缩:删除 Javascript 代码中所有注释.跳格符号.换行符号及无用的空格,从而 ...
- 区域及分离、Js压缩、css、jquery扩展
后台管理区域及分离.Js压缩.css.jquery扩展 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 有好一段时间没更新博文了,最近在忙两件事:1.看书,学习中...2.为公司年会节目做 ...
- webpack 3.X学习之JS压缩与打包HTML文件
js压缩 webpack自带一个插件uglifyjs-webpack-plugin来压缩js,所以不需要再次安装,当一切都准备妥当,引入uglifyjs-webpack-plugin模块: const ...
- 图片纯前端JS压缩的实现
一.图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅 ...
- 使用zip.js压缩文件和解压文件
zip.js官方网站为:https://stuk.github.io/jszip/ 在此说明,下面的例子基本上来自官方示例,大家可以做参考,官方示例地址为:https://stuk.github.io ...
- webpack快速入门——配置JS压缩,打包
1 .首先在webpack.config.js中引入 const uglify = require('uglifyjs-webpack-plugin'); 2.然后在plugins配置里 plugin ...
随机推荐
- Java基础11-List;Set;Map
作业解析: remove(int index); //删除指定位置的元素 List list = new ArrayList(); list.add("s1"); list.add ...
- 使用SpringSecurity体验OAuth2 (入门2)
本文继续使用SpringSecurity从实战角度对OAuth2进行体验,上一篇 搭建了项目环境,并对配置做了初步分析,分析发现会有两套配置可能在影响OAuth,一个是由授权服务的启动类上的注解@En ...
- webpack2 实践
实例gif图: 目录截图: 目录介绍: dist目录(最后生成的目录,里面文件为配置webpack自动生成的): c/:css文件夹; i/:img文件夹; j/:js文件夹; src目录下(开发目录 ...
- Codeforces 558E A Simple Task (计数排序&&线段树优化)
题目链接:http://codeforces.com/contest/558/problem/E E. A Simple Task time limit per test5 seconds memor ...
- C#发送带附件的邮件的代码
如下的代码是关于C#发送带附件的邮件的代码. MailMessage m = new MailMessage();m.Subject = "File attachment!";m. ...
- linux线程 join/detach
linux中创建线程时,可以通过 __attr 指定线程的属性 extern int pthread_create (pthread_t *__thread, __const pthread_attr ...
- Hanlp学习笔记
一.首先要引入mawen依赖包: <dependency> <groupId>com.hankcs</groupId> <artifactId>hanl ...
- 解决MongoDB登录的WARNING
解决MongoDB登录的WARNING 1.安装完成运行mongodb警告内容如下: 2019-01-17T15:41:50.578+0800 I CONTROL [initandlisten] ** ...
- ***阿里云ECS实战配置虚拟主机 + Apache 配置虚拟主机三种方式
阿里云ECS实战配置虚拟主机 买了一台ECS阿里云服务器,性能感觉有点富余,想着可以陪着虚拟主机多一些WWW目录好放一些其他的程序.比如DEMO什么的. 今天研究了下,主要是就是做基于不同域名的虚拟主 ...
- Node js redis
const redis = require('redis');//redis , '172.16.4.2'); //redis操作 client.set("hello", &quo ...