开发了一款写作软件(OSX,Windows),附带Electron开发指南

断断续续写了个把月,终于在昨天完成了第一版…

笔落写作


一款帮助网络写手更方便地进行小说创作的PC软件,目前支持 OSX/Windows

名字灵感来自于杜甫的一首诗,前两句是:

《寄李十二白二十韵》

昔年有狂客,号尔谪仙人。

笔落惊风雨,诗成泣鬼神。

对于名字,要感谢下@蓝色

预览的话,可以去官网

作为我的第一款商业性(虽然才卖出去一个,还是朋友捧场…)产品,我投入了很多精力。而且,重要的还在后面,那就是运营

怎么让得让更多的人知道并且去使用它?直觉告诉我,这将是比写代码还要难的事情...

Electron 开(cai)发(keng)指南


主要用到了Electron-Vue这个框架,让我不用花时间去琢磨配置WebpackElectron,上来就直接开发。感谢开源社区!

歪个楼:我对Wepback的看法就是,笼统的了解下运行原理就行了,现成并且配置好的Webpack模板直接用,遇到特殊需求,查文档,查Google知道怎么改即可。

开发要求你比较熟悉VueNode,这里不会讲基础的东西,讲基础知识的除了官方文档,网上有更多相关文章可供选择。

细数踩过的坑:

首先,我遇到了:dev模式没问题,打包后空白页的问题?

如果你刚刚生成项目,什么都没有动的话,那就可能是Webpack在打包时,把Vue当成了外部文件没有打包进去。

代码在:webpack.renderer.config.js

注释掉...Object.keys(dependencies || {}).filter(d => !whiteListedModules.includes(d))即可

然后,又遇到了多窗口的需求:

开始没思路,因为多窗口和一般前端开发时遇到的多路由,多Tab还不是一回事儿。后来经人指点,才明白其实多窗口挺简单的...

我们先观察生成的代码模板中,主窗口是怎么生成的:

let mainWindow;  //主窗口变量
const winURL =    
  process.env.NODE_ENV === 'development' ?
  `http://localhost:9080` :
  `file://${__dirname}/index.html`  // 设置URL或者文件,毕竟Electron App其实运行在Chromium中
  
mainWindow = new BrowserWindow(options)  // new 一个窗体对象,同时传一些参数
mainWindow.loadURL(winURL)    // 加载URL,加载之后,窗口就会被显示出来。

那么,我们依葫芦画瓢,第二个窗口就可以这么写

let secondWindow; 
 const modalPath = process.env.NODE_ENV === 'development' ?
    'http://localhost:9080/#/showOutline' :
    `file://${__dirname}/index.html#showOutline`  // 的确比较简单...
  
secondWindow = new BrowserWindow(options)  
secondWindow.loadURL(modalPath)    

PS: 这里提醒下vue-router不要设置成history模式。原因在文档里看到过,忘了,想知道就去查文档 :p

多窗口下的Vuex异常:

开发多窗口时并没有意识到vuex存在问题,后面发现数据怎么都对不上,然后排查问题时发现,两个窗口的state(状态)并不同步,即:

当你在打开窗口B时,此时两个窗口的Vuex数据时一致的,但一旦你的B窗口的数据状态发生变化,其并不能反映到窗口A里。为什么不行,其实也很好理解。

歪个楼:说下我对Vuex实现原理的理解。以前刚开始学习Vue还没有学Vuex时,当时我解决多组件(非父子)之间的通讯方式除了利用父组件做中间人(event bus)外,还试过维护一个全局JSON(比如共用一个store.js),然后其他组件都能访问及操作。后来学了Vuex,发现它的工作方式和我想的差不多。(当然,我并没有去看源码,它真正的实现方式是什么。但直觉告诉我应该是这样没错了!)

让我反问一句:为什么两个窗口之间的数据能一直同步?

解决方法: 我结合了Electron文档中提到的两种方式:ipc通讯在主进程维护全局变量

PS: 经人点拨,ipc通讯的实现利用了浏览器的postMessage接口(话说这个API,之前还真没听过说...)

在Vue中自己实现富文本编辑器:输入框的双向绑定和自动聚焦(auto focus)

还有个不算是Electron,只能说是Vue方面的问题。

本来写这个项目时就没打算来自己实现富文本编辑器,本着能用开源就用开源的原则,在项目里测试了一些开源的编辑器,发现或多或少都有些问题,后来一琢磨,反正这个项目的富文本编辑器需求不复杂,就自己实现一个好了。

编辑器的输入框,我使用的HTML属性contenteditable来实现。

编辑器组件的双向绑定和自动聚焦的细节参考这篇文章

此外,还有些坑不知道什么原因造成的:

用户数据的本地存储我用了lowdb

本质就是通过 nodefs模块来操作本地 JSON文件,只不过它比我们自己实现的要优雅,可靠多了

然后有个需求是,当触发某种条件时,保存对应的变量:

// 当用户点击Button A
db.set('a',111).write();
// 当用户点击Button B
db.set('b',222).write();

此时,如果用户点击了Button A,不仅a 数据会更新,b数据也会更新,反之同样。

这不是lowdb的问题,因为我单独测试过,点击Button A并不会导致其他set函数调用!

所以这应该算是一个奇怪的问题吧。

利用ipcRenderer监听通信时,如果在listener内使用了异步:

 ipcRenderer.on('delete', () => {
     // 异步这里特指setTimeout
     setTimeout(() => {
     // 不知为何,_this.remove会调用多次(但发现ipcMian.send只被调用了一次!)
     _this.remove(this.nodeWasRightClicked, this.dataWasRightClicked);
     }, 0);
 });

另外: 打包软件时也遇到了很多问题,但最终都通过Google解决掉了,所以这里不复述了(所谓面向Google编程

其他问题后续会继续补充,欢迎持续关注!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 macOS 上开发 Go 应用程序,您需要先安装 Go 编程语言和一些必要的工具。以下是一些步骤: 1. 安装 Go 编程语言:可以从官方网站 https://golang.org/dl/ 下载并安装最新版本的 Go。 2. 安装 Go 的包管理器 - Go Module:Go Modules 是一个包管理工具,可用于管理项目的依赖项。在终端中执行以下命令:`go env -w GO111MODULE=on`,然后在任何 Go 项目中执行`go mod init`以初始化模块。 3. 安装 Visual Studio Code 编辑器:建议使用 VS Code 作为 IDE 来编写和运行 Go 应用程序。 4. 在 VS Code 中安装 Go 插件:打开 VS Code 编辑器,点击左侧的扩展图标,搜索 Go 并安装它。 5. 创建一个新项目:在终端中创建一个新目录,并在该目录中创建一个名为 `main.go` 的文件。 6. 在 main.go 文件中编写代码:可以使用以下代码作为示例: ```go package main import "fmt" func main() { fmt.Println("Hello, world!") } ``` 7. 在终端中运行应用程序:在终端中切换到包含 main.go 文件的目录,并使用以下命令运行应用程序: ```bash go run main.go ``` 这将编译并运行 main.go 文件中的代码,并输出 "Hello, world!"。 这只是入门指南,您可以继续深入了解 Go 语言和 macOS 应用程序开发。 ### 回答2: 要在OSX开发应用,可以使用Go语言和相关工具来进行开发。 首先,确保已经安装了Go语言的开发环境。可以从官方网站(https://golang.org/)下载并安装Go语言的二进制文件。安装完成后,可以通过运行“go version”命令来验证是否安装成功。 接下来,可以选择一个合适的集成开发环境(IDE)来进行开发。一些流行的Go语言IDE包括Visual Studio Code和GoLand等。这些IDE都有丰富的功能,能够提供代码自动完成、调试、版本控制等开发所需的功能。 然后,可以开始编写应用的代码。使用Go语言的强大功能和标准库,可以轻松地构建出高效、可靠的应用程序。可以使用Go语言的GUI库,如fyne或go-gtk等,来创建OSX应用程序的图形用户界面。 在编写代码时,可以利用Go语言的包管理工具来管理项目的依赖关系。Go语言的包管理工具有go mod和dep等,可以帮助解决包依赖和版本管理的问题。 在应用开发完成后,可以使用Go语言的交叉编译功能,将应用程序编译为OSX平台上的可执行文件。通过交叉编译,可以在不同的操作系统上构建应用程序,以便在OSX上进行测试和部署。 最后,可以使用OSX上的图形用户界面工具(如Finder)或命令行工具,在OSX系统中安装和运行已编译的应用程序。 总之,使用Go语言进行OSX应用程序的开发是一种高效、可靠的方式。通过选择合适的工具和库,结合Go语言的强大功能,可以轻松地创建出优秀的应用程序。 ### 回答3: 如果您想要开发适用于OSX操作系统的应用程序,可以使用Go语言作为开发工具。Go是一种简洁高效的编程语言,由谷歌公司开发,广泛用于构建可靠且具有高性能的应用程序。 首先,您需要安装Go语言的开发环境。您可以从官方网站上下载并安装适用于OSX的Go编译器和工具链。安装完成后,您可以在终端中执行"go version"命令,以验证Go是否正确安装。 接下来,您可以选择使用一些流行的集成开发环境(IDE)来编写Go代码,例如GoLand、Visual Studio Code或者LiteIDE。这些IDE可以提供便捷的代码编辑和调试功能,以加快开发速度。 对于OSX应用开发,您可以使用Go的标准库和第三方库来构建功能丰富的应用。标准库中提供了许多实用的模块,例如操作系统接口、网络通信和文件处理等。此外,Go语言拥有丰富的第三方库和框架,您可以借助这些库来简化开发过程,例如GUI库(如fyne或go-gtk)和数据库库(如gorm或xorm)等。 在编写代码时,您可以使用Go的并发和并行特性来提高应用程序的性能。Go通过goroutine和channel机制,使并发编程变得简单而高效。您可以将耗时的操作(如网络请求或文件读写)放入单独的goroutine中,并通过channel进行通信和同步。 最后,当您完成应用的开发后,可以使用Go提供的交叉编译功能,将应用程序编译为适用于OSX平台的可执行文件。此外,您还可以使用一些打包工具来创建应用程序的安装包,以方便用户进行安装和使用。 总之,使用Go语言开发OSX应用程序可以使您的开发过程更简单和高效。Go的简洁性、高性能和并发特性使其成为构建现代化应用程序的理想选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值