# Electron 桌面应用 本章节以 Mac OS X下 Hosts 文件管理 App 为例。 技术栈包含: * Electron (仅 OS X 平台) * Webpack 2 * Vue 2 * Vuex * Vue-Router * Vue-Material (UI组件) * Babel * ESLint * Yarn(包管理) ## 初始化项目 * 安装所需的各种 NPM 包。 * 引入 ESLint、Babel 配置文件。 ## 配置 Vue2 + Webpack2 需要注意`Webpack` 2.x.x 版本与 1.x.x 版本发生了不少改动。可以参考迁移文档: 进行学习。 ### 坑1: extract-text-webpack-plugin 该插件 NPM 最新版本为1.0.1,不支持 Webpack2,所以需要通过安装 RC3 版本来获得对应支持。 ``` yarn add --dev extract-text-webpack-plugin@2.0.0-rc3 或 npm i --save-dev extract-text-webpack-plugin@2.0.0-rc3 ``` ### 坑2:babel-plugin-transform-runtime 与 extract-text-webpack-plugin 插件有冲突 会导致 extract-text 插件报错崩溃。 解决方法,修改 `.babelrc`: ```json { "presets": [ "latest" ], "plugins": [ [ "transform-runtime", { "helpers": false, "polyfill": false, "regenerator": true } ] ], "compact": true } ``` 其中 设置`compact`属性还能阻止 500kb 限制的警告。 ### 坑3:postcss-loader 与 extract-text-webpack-plugin 插件有冲突 目前无解,去掉了`postcss-loader`的使用。 下一阶段尝试。 ### 坑4:在 Vue 中使用 Electron 首先,需要在 webpack config 中设置: ```yaml target: 'electron' ``` 向 Electron 注册插件: ```js import Vue from 'vue'; import electron from 'electron'; Vue.use({ install: (vue) => { vue.prototype.$electron = electron; } }); ``` 前端向 IPC 发送消息: ```js this.$electron.ipcRenderer.send('resizePreferencesWindow', { width: 400, height: 300 }); ``` ## Electron 配置 ### 设置 App 开机自启 使用插件: ```js import AutoLaunch from 'auto-launch'; const hostsAutoLauncher = new AutoLaunch({ name: 'Hosts.js', path: '/Applications/Hosts.js.app' }); exports.isEnabled = async () => { const result = await hostsAutoLauncher.isEnabled(); return result; }; exports.enable = () => { hostsAutoLauncher.enable(); }; exports.disable = () => { hostsAutoLauncher.disable(); }; ``` ### 添加 Electron Vue DevTools 可以直接通过插件实现,地址: devtools.js: ```js import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'; module.exports = installExtension(VUEJS_DEVTOOLS); ``` 窗口加载: ```js if (process.env.NODE_ENV === 'development') { // 开发模式加载 devtools const devtools = require('../lib/devtools'); devtools.then(() => { // 注意调用方式 this.preferencesWindow.loadURL('http://localhost:3000/build/app.html'); }); } else { this.preferencesWindow.loadURL(`file://${path.join(__dirname, '../../build/app.html')}`); } ``` ## 设计核心模块 ### Hosts 分级列表 特点: * 支持顶级项目 * 支持二级目录项目 * 目录不含有启动状态,目录下的子项目有 * 支持排序 ```js [ { name: 'Default', order: 1, id: 'xxx', type: 'item', enabled: true }, { namename: 'Folder', order: 2, id: 'xxx', type: 'folder', children: [ { name: 'Sub Item 1', order: 1, id: 'xxx', type: 'item', enabled: false }, { name: 'Sub Item 2', order: 2, id: 'xxx', type: 'item', enabled: true }, ] } ] ``` 排序算法: 1. 对顶级项目进行排序 2. 对子菜单项目进行排序 ```js const reorder = arr => arr.sort(x => x.order).map(x => { if (x.type === 'folder') { x.children = x.children.sort(y => y.order); } return x; }); ``` --- Hosts.js项目源码: