Electron+React+Webpack+Vscode应用桌面开发平台搭建

https://my.oschina.net/xpbug/blog/637864
摘要: 作为一个java程序员,如果要开发桌面,则需要使用swing,awt。c++程序员则会用mfc,或c#。这些技术要不太过古老,要不太难用,要不市场上相关的人才太少。自从nodejs出来以后,js开始走向后端。市面上也出现了一些使用js+html开发应用桌面的技术,例如nwjs和electron(Atom和vscode编辑器都是基于electron开发的)。由于前端资源充足,开发效率高,界面更加美观,且容易移植多平台,使用js+html技术开发桌面将会越来越流行。本文将重点描述如何搭建开发的平台,不涉及技术知识讲解。

前提

先安装nodejs,NPM,vscode,electron

源代码

https://github.com/xpbug/electron-react-webpack

从源代码开始

下载代码以后,在代码的根路径执行

>npminstall

然后进行,生成app目录

>webpack

执行

>electronapp

从零开始

创建demo文件夹,在demo目录下面,执行命令

>npminit

跟着guide,初始化package.json文件。

然后引入开发时所需要的依赖

>npminstall--save-devbabelbabel-corebabel-preset-es2015babel-preset-react
>npminstall--save-devcss-loaderstyle-loaderless-loaderbabel-loaderwebpackcopy-webpack-plugin
>npminstall--save-develectron-prebuilt
>npminstall--save-devreactreact-dom

第一部分依赖是ES6语法相关的。

第二部分依赖是webpack相关的。webpack可以将js,css等文件打包,压缩,还可以将jsx和babel转义为es5的语法。必须要对jsx和babel转义,当前浏览器和nodejs是还无法支持jsx和es6。

第三部分是electron的开发环境。

第四部分是react依赖。

创建项目结构

使用vscode,打开目录demo,在demo下面创建src目录。我们的源代码将放在src下面。

Electron的JS主要分两个进程,一个是main process,一个是render process。Main process是程序的主进程,当需要展示桌面的时候,主进程会开启一个render进程。render进程包装了chromium,起了一个类似chrome的程序展示html,运行js。

在src下面,ui目录中放的属于render进程的代码,jsx放react jsx代码,backend放属于主进程的代码。

Webpack打包

webpack可以对babel和jsx进行转义,并打包压缩。我们只对属于UI进程的js和css进行打包和压缩,而对主进程的代码不压缩。主进程代码跑在nodejs的环境中,webpack打包会破坏__dirname和__filename机制。

在demo的根目录下创建webpack.config.json。

varpath=require('path'); varwebpack=require('webpack'); varCopyWebpackPlugin=require('copy-webpack-plugin'); varAPP_PATH=path.resolve(__dirname,'app'); varSRC_PATH=path.resolve(__dirname,'src'); module.exports={ cache:true,target:'electron',devtool:'source-map',entry:{ ui:'./src/ui/ui' },output:{ path:APP_PATH,filename:'[name].js',chunkFilename:'[chunkhash].js',sourceMapFilename:'[name].map' },module:{ loaders:[ { test:/\.js|\.jsx?$/,loader:'babel-loader',include:[SRC_PATH],query:{ presets:['es2015','react'],} },{test:/\.css$/,loader:'style-loader!css-loader'},{test:/\.less$/,loader:'style-loader!css-loader!less-loader'} ] },plugins:[ newwebpack.optimize.DedupePlugin(),//newwebpack.optimize.UglifyJsPlugin({comments:false}), newwebpack.EnvironmentPlugin(["NODE_ENV"]),newCopyWebpackPlugin([ {from:path.resolve(SRC_PATH,'main.js'),to:'main.js'},{from:path.resolve(SRC_PATH,'backend'),to:'backend'},'ui/index.html'),to:'index.html'},'package.json'),to:'package.json'} ]) ] };varpath=require('path'); varwebpack=require('webpack'); varCopyWebpackPlugin=require('copy-webpack-plugin'); varAPP_PATH=path.resolve(__dirname,to:'package.json'} ]) ] };

将不需要压缩的静态文件,使用copy插件进行复制。

运行命令

>webpack

程序将被复制到app目录下面。

执行程序

>electronapp

调试

首先,如果每次修改代码,都需要重新编译app才能运行,这种开发效率很低,可以使用下面的命令。当src下面的代码有变动是,webpack会自动编译到app。

>webpack--watch

UI进程的代码可以使用chrome自带的dev tools来调试。

对于main进程,我们可以使用v8的debug协议在vscode中调试。

启动electron的debug模式,代码会停在第一行,远程debug端口5858.

>electron--debug-brk=5858app

在vscode中,点击“debug”。点击绿色的三角,按照引导,创建launch.json

现在再一次点击绿色的三角,就可以debug桌面程序了。

打包成exe

下载electron的源码,使用自己的icon,将electron重新build成自己的brand。

然后使用asar工具,将自己的app打成asar包,asar可以保护代码不被其他人看到。然后将asar包复制到electron\resources\app.asar。

点击xxx.exe便可以运行了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom