详解基于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基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
eclipse如何忽略js文件报错(附图)
Oct 30 Javascript
javascript中clone对象详解
Dec 03 Javascript
node.js集成百度UE编辑器
Feb 05 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
JavaScript中原型链存在的问题解析
Sep 25 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 jQuery
vue项目引入字体.ttf的方法
Sep 28 Javascript
微信小程序中遇到的iOS兼容性问题小结
Nov 14 Javascript
手把手带你封装一个vue component第三方库
Feb 14 Javascript
JS实现排行榜文字向上滚动轮播效果
Nov 26 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 pdo操作数据库示例
2017/03/10 PHP
php 开发中加密的几种方法总结
2017/03/22 PHP
js中判断控件是否存在
2010/08/25 Javascript
apply和call方法定义及apply和call方法的区别
2015/11/15 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
浅谈Python爬取网页的编码处理
2016/11/04 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
项目管理计划书
2014/01/09 职场文书
主持人演讲稿
2014/05/13 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
会计学习心得体会
2014/09/09 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
小组组名及励志口号
2015/12/24 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
DSP接收机前端设想
2022/04/05 无线电
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python