详解基于electron制作一个node压缩图片的桌面应用


Posted in Javascript onJanuary 29, 2019

基于electron制作一个node压缩图片的桌面应用

下载地址:https://github.com/zenoslin/imagemin-electron/releases

项目源码Github:https://github.com/zenoslin/imagemin-electron

准备工作

我们来整理一下我们需要做什么:

  1. 压缩图片模块
  2. 获取文件路径
  3. 桌面应用生成

压缩图片

我们需要使用imagemin这个库来压缩图片,这里我们把这个库封装成压缩模块。

const imagemin = require('imagemin')
const imageminMozjpeg = require('imagemin-mozjpeg')
const imageminPngquant = require('imagemin-pngquant')
const imageminGifsicle = require('imagemin-gifsicle')

async function compass(input, output, opts, callback) {
  let log = await imageminCompass(input, output, opts)
  callback(log)
}

async function imageminCompass(input, output = 'temp', opts = {}) {
  input = (typeof input == 'string') ? [input] : input;
  return await imagemin(input, output, {
      use: [
        imageminMozjpeg(opts),
        imageminPngquant(opts),
        imageminGifsicle({
          optimizationLevel:3
        })
      ]
    })
    .then(file => {
      return {
        status: true,
        data: file
      };
    })
    .catch(e => {
      console.log(e);
      return {
        status: false,
        error: e.toString()
      }
    });
}

module.exports = {
  compass: compass
};

获取文件路径

在我的理解中,electron用的是一个mini版的chrome浏览器,然后帮我们实现了浏览器跟系统(win & mac)交互的的许多api接口。

我们可以通过正常写网页的方式进行开发,当需要进行与系统交互的操作时,我们只需要在我们网页中的js进程(这里应该叫做这个桌面应用的渲染进程)抛出一个事件,然后在electron的主进程进行监听,收到事件后调用相应的api接口,结果再反过来用事件的方式抛给渲染进程。

electron的安装和学习可以上官网https://electronjs.org/进行学习。

ps:这里有一个electron的坑说一下,electron和jquery存在冲突,所以直接用script标签引入会失败,在windows对象中找不到jQuery对象。这里我们可以加这么一句解决。

<script src="./src/jquery.min.js"></script>
<script>if (typeof module === 'object') {window.jQuery = window.$ = module.exports;};</script>

回到正题,首先我们在index.html中增加一个按钮来打开系统的路径选择器。

<button id="input-btn">选择路径</button>

在渲染进程renderer.js中,监听按钮的点击,以及监听主线程返回的事件。

const {ipcRenderer} = require('electron')
const inputBtn = document.getElementById('input-btn')

inputBtn.addEventListener('click', (event) => {
  console.log('点击输入按钮')
  ipcRenderer.send('open-file-dialog-input')
})

ipcRenderer.on('input-path', (event, path) => {
  console.log(`收到完成信息 ${path}`)
  _inputPath = path
  inputPath.value = `${path}`
})

在主进程main.js中,监听渲染进程抛出的事件,并调用api接口后放回结果。

ipcMain.on('open-file-dialog-input', (event) => {
  dialog.showOpenDialog({
    properties: ['openFile', 'openDirectory']
  }, (files) => {
    if (files) {
      console.log('发出完成信息')
      event.sender.send('input-path', files)
    }
  })
})

这样我们完成了使用系统api接口选择路径的功能。但其实我们实际的使用场景中路径选择器的方式并不是特别的方便,所以我们实现另一个功能。

拖动将文件或者文件夹拖入网页中,获取到对应的路径。这里使用了js+div实现了这个功能。

index.html

<!--可拖入区域-->
<div id="holder" class="jumbotron holder">
</div>
<style>
    /* 拖拽的区域样式 */
    .holder {
      min-height: 200px;
      background: #eee;
      margin: 2em;
      padding: 1em;
      border: 0px dotted #eee;
      border-radius: 10px;
      transition: .3s all ease-in-out;
    }

    /* 拖拽时用jQuery为其添加边框样式的class */
    .holder-ondrag {
      border: 20px dotted #d45700;
    }
</style>

renderer.js

const holder = document.getElementById("holder")

holder.ondragenter = holder.ondragover = (event) => {
  event.preventDefault()
  holder.className = "jumbotron holder-ondrag"
}

holder.ondragleave = (event) => {
  event.preventDefault()
  holder.className = "jumbotron holder"
}

holder.ondrop = (event) => {
  // 调用 preventDefault() 来避免浏览器对数据的默认处理
  //(drop 事件的默认行为是以链接形式打开
  event.preventDefault()
  holder.className = "jumbotron holder"
  var file = event.dataTransfer.files[0]
  _inputPath = inputPath.value = file.path
}

将我们获取到的文件路径传入前面编写的压缩文件模块,这样我们就可以完成了图片的压缩。

桌面应用生成

最后,我们利用electron-packager完成对electron桌面应用的打包。

//mac
electron-packager . --out=out --platform=mas --arch=x64
//win
electron-packager . --platform=win32 --arch=x64

ps:在非Windows主机平台上进行打包,需要安装Wine 1.6或更高版本

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
JavaScript 浮点数运算 精度问题
Oct 06 Javascript
Jquery 的outerHeight方法使用介绍
Sep 11 Javascript
JavaScript中检测变量是否存在遇到的一些问题
Nov 11 Javascript
js二维数组排序的简单示例代码
Jan 24 Javascript
javascript使用smipleChart实现简单图表
Jan 02 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
基于layui数据表格以及传数据的方式
Aug 19 Javascript
vue中组件的过渡动画及实现代码
Nov 21 Javascript
JavaScript实现的九种排序算法
Mar 04 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
Mar 09 Javascript
JS数据类型判断的几种常用方法
Jul 07 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
Jan 29 #Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
Jan 29 #Javascript
JS实现的类似微信聊天效果示例
Jan 29 #Javascript
vue实现form表单与table表格的数据关联功能示例
Jan 29 #Javascript
vue input实现点击按钮文字增删功能示例
Jan 29 #Javascript
详解基于webpack&amp;gettext的前端多语言方案
Jan 29 #Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
Jan 29 #Javascript
You might like
php实现源代码加密的方法
2015/07/11 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
php 输出缓冲 Output Control用法实例详解
2020/03/03 PHP
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
小巧强大的jquery layer弹窗弹层插件
2015/12/06 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
vue内置指令详解
2018/04/03 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
python连接mysql实例分享
2016/10/09 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
PyQT实现多窗口切换
2018/04/20 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
英语专业毕业生自荐信
2013/10/28 职场文书
工作会议欢迎词
2014/01/16 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
团队精神口号
2014/06/06 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
百万英镑观后感
2015/06/09 职场文书
2016寒假社会实践心得体会范文
2015/10/09 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
Python快速实现一键抠图功能的全过程
2021/06/29 Python
Golang入门之计时器
2022/05/04 Golang