#项目结构
my-project ├─ .electron-vue(webpack配置文件) │ └─ build.js(生产环境构建代码)
│ └─ dev-client.js(热加载相关)
│ └─ dev-runner.js(开发环境启动入口)
│ └─ webpack.main.config.js(主进程配置文件)
│ └─ webpack.renderer.config.js(渲染进程配置文件)
│ └─ webpack.web.config.js ├─ build(是文件打包使用的) │ └─ win-unpacked/
│ │ ├─ locales(地区语言资源包)
│ │ ├─ resources(地区语言资源包)
│ │ ├─ *.dll(动态链接库) ├─ dist(打包后的文件资源) │ ├─ electron/ ├─ node_modules/(依赖目录) ├─ src(源码) │ ├─ main(主进程) │ │ ├─ index.dev.js(捆绑index.js) │ │ └─ index.js(主进程的进程JS) │ ├─ renderer(渲染进程)
│ │ ├─ assets/(放置静态资源,如图片,视频,静态配置)
│ │ ├─ components/(放置vue页面) │ │ ├─ router/(放置页面路由) │ │ ├─ store/(放置公共模块,如vuex) │ │ ├─ App.vue │ │ └─ main.js │ └─ index.ejs ├─ static/(静态文件) ├─ test │ ├─ e2e │ │ ├─ specs/ │ │ ├─ index.js │ │ └─ utils.js │ ├─ unit │ │ ├─ specs/ │ │ ├─ index.js │ │ └─ karma.config.js │ └─ .eslintrc
#全局配置文件 ├─ .babelrc ├─ .eslintignore ├─ .eslintrc.js ├─ .gitignore ├─ package.json └─ README.md
#语法规范
require 是 AMD规范引入方式
require是运行时调用,所以require理论上可以运用在代码的任何地方
require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法
import是编译时调用,所以必须放在文件开头
import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
#模块功能说明
- electron.app:负责管理Electron 应用程序的生命周期
- electron.BrowserWindow:负责创建窗口
- globalShortcut:模块可以在操作系统中注册/注销全局快捷键, 以便可以为操作定制各种快捷键
- Menu:创建原生应用菜单和上下文菜单
- ipcMain:当在主进程中使用时,它处理从渲染器进程(网页)发送出来的异步和同步信息。 从渲染器进程发送的消息将被发送到该模块
-
Notification:创建OS(操作系统)桌面通知
- fs:在 NodeJS 中,所有与文件操作都是通过 fs 核心模块来实现的,包括文件目录的创建、删除、查询以及文件的读取和写入,在fs 模块中,所有的方法都分为同步和异步两种实现,具有
sync
后缀的方法为同步方法,不具有sync
后缀的方法为异步方法 - path:Node.js path 模块提供了一些用于处理文件路径的小工具
- screen:检索有关屏幕大小、显示器、光标位置等的信息
- shell:提供与桌面集成相关的功能
-
webContents:渲染以及控制 web 页面
- ffi(Foreign Function Interface):node调用动态链接库(.so/.dll文件),解决NodeJS的本地调用问题,其流程就相当于Windows下的LoadLibrary()和GetProcAddress(),亦可以理解为NodeJS下的平台调用。
- sql.js:sqlite的Webassembly版,使用上和sqlite基本没有区别,一个开箱即用的sql库
child_process
:提供了衍生子进程的能力child_process.exec()
: 衍生一个 shell 并在该 shell 中运行命令,当完成时则将stdout
和stderr
传给回调函数
#变量说明
- __dirname:总是指向被执行 js 文件的绝对路径
- __filename:获取当前模块文件的带有完整绝对路径的文件名
#为什么要用dll
- 需要使用系统 API 操作或扩展应用程序;
- 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的;
- 需要调用C++实现的一些复杂算法等。