基于 Electron, React, React-router, Typescript 一款桌面豆瓣电影应用
源码: github.com/Yangfan2016…
web 项目源码:github.com/Yangfan2016…
作者:github.com/Yangfan2016
前言
618 在慕课网上淘了一个 1 元的 electron 课程,一个基础的入门课,还不错,就想着把前些日子写的 React+Typescript 实现一个简单的豆瓣电影应用 改造下,这次也是参(cao)考(xi)腾讯视频(mac 端 app)的 UI(腾讯视频请给我打钱,)
先来看下最终效果
准备工作
首先你要有以下的基础知识
项目目录
先来看下最终的目录结构
可以使用 treer 来生成目录结构
$ npx treer -i "/^(node_modules|dist|build|notes|\.git|\.DS_Store)$/" >tree.txt 复制代码 douban-movie-electron ├─.yarnrc # yarn 的配置文件 ├─app.config.js # app 的全局配置 ├─main.js # app 的主进程 ├─package.json ├─src # 原有 web 项目的源码(这里忽略展开) | |...... ├─server # api 代理服务器 | ├─app.js | ├─package.json | └yarn.lock ├─scripts | ├─build.js | ├─start.js | └test.js ├─public | ├─favicon.ico | ├─index.html # 主窗口 | ├─manifest.json | ├─play.html # 播放窗口 | └renderer.js # 播放窗口的渲染进程 ├─config | ├─env.js | ├─paths.js | ├─webpack.config.js | ├─webpackDevServer.config.js | ├─jest | | ├─cssTransform.js | | └fileTransform.js ├─assets # app 的logo | ├─icon.png | └logo.png 复制代码
开发注意
需要安装如下包依赖
"devDependencies": {
"electron": "4.1.3", # electron 本体
"electron-builder": "^20.40.2", # electron 打包工具
"nodemon": "^1.18.10" # 监听文件,重启 node 应用
}
electron 包下载较慢,我们需要配置下,在项目里新增 .npmrc 或 .yarnrc 文件(如果你的项目没有使用 sass 的话,不用设置 node-sass 的镜像地址)
.npmrc
registry=https://registry.npm.taobao.org/ sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ electron_mirror=https://npm.taobao.org/mirrors/electron/
.yarnrc
registry "https://registry.npm.taobao.org/" sass_binary_site "https://npm.taobao.org/mirrors/node-sass/" electron_mirror "https://npm.taobao.org/mirrors/electron/"
项目改造
const { app, BrowserWindow }=require('electron')
const path=require("path");
app.on('ready', ()=> {
// 新建一个窗口
let mainWindow=new BrowserWindow({
width: 1160,
height: 720,
});
// 原有的项目开发环境下的 devServer 的端口是 3000 ,我们这里以 url 形式把原有项目加载进来
mainWindow.loadURL('http://localhost:3000');
});
"scripts": {
"start": "node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js",
"server": "node server/controllers/index.js",
"electron-dev": "nodemon --watch ./main.js --exec 'NODE_ENV=development electron .'"
}
# 并行执行 $ yarn start & yarn electron-dev
推荐这个在线原型图工具 whimsical.com/
同样参照腾讯视频,播放视频时,会单独弹出一个新窗口进行播放,在 electorn 里,就是再新建一个窗口
new BrowserWindow({
width: 1100,
height: 500,
titleBarStyle: "hiddenInset",
});
现在就有一个问题,就是点击主窗口的某个电影打开这个播放窗口,那么信息(例如 视频的 src 地址)该如何传递内,我们从 electron 的文档里可以找到,ipcMain 和 ipcRenderer 这两个api,用它们进行主进程和渲染进程之间的通信
项目生产环境配置
const { app, BrowserWindow }=require('electron')
const path=require("path");
const isProd=process.env.NODE_ENV !=="development";
app.on('ready', ()=> {
// 新建一个窗口
let mainWindow=new BrowserWindow({
width: 1160,
height: 720,
});
// 生产环境
if (isProd) {
// cra 默认的打包目录是 build,我们生产环境需要这么引入
mainWindow.loadFile(path.join(__dirname, "./build/index.html"));
} else { // 开发环境
mainWindow.loadURL('http://localhost:3000');
}
});
const Koa=require("koa");
const proxy=require("koa-server-http-proxy");
const app=new Koa();
// proxy
app.use(proxy('/api', {
target: 'http://api.douban.com/',
changeOrigin: true,
pathRewrite: {
'^/api': '/v2', // 重写路径
},
}));
app.use(proxy('/bing', {
target: 'https://www.bing.com/',
changeOrigin: true,
pathRewrite: {
'^/bing': '/', // 重写路径
},
}));
- app.listen(server.port, ()=> {
- console.log(server.url);
- });
+ module.exports=app;
const apiServer=require("./server/app");
// 生产环境我们直接启动 我们的 nodejs 服务
if (isProd) {
// start api server
apiServer.listen(server.port, ()=> {
console.log(server.url);
});
} else { // 开发环境 我们直接启动 webpackDevServer
// start webpack-devserver
require("./scripts/start");
}
打包
使用 electron-builder 打包
"scripts": {
"start": "node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js",
"server": "node server/controllers/index.js",
"electron-dev": "nodemon --watch ./main.js --exec 'NODE_ENV=development electron .'",
"dist": "rm -rf ./dist && electron-builder"
},
// electron-builder 的配置
"build": {
"appId": "douban-movie-electron",
// 打包的文件目录,这样可以减少安装包大小
"files": [
"package.json",
"node_modules/**/*",
"build/**/*",
"assets",
"server",
"main.js",
"app.config.js"
],
// mac 端的打包配置下,详细配置 https://www.electron.build/configuration/mac
"mac": {
"category": "public.app-category.video", mac 应用程序分类 https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW8
"target": [
"dmg"
],
"icon": "./assets/icon.png"
}
},
执行命令
$ yarn dist
安装
打包的文件会在 dist 文件夹下,我们找到 dmg 文件,进行安装
安装完成,进行预览,发现 ,哎,首页的轮播图加载失败了 (404),我仔查看路径,没有任何问题,但是发现 它们的路径有一个特点就是都是 file:///static 开头的(本地图片以相对路径引用的,其他 js css 文件也是以相对路径引入的,只有图片404,奇怪 )
几经周折,终于找到了问题,React-router 我用的是 browserRouter ,就是基于浏览器 history api的,改成 hashRouter ,就好了(目前原因未知 ,知道原因的小伙伴请教下)
时间有限,其他平台的打包方式及配置,请移步到 electron-builder 官网
大家推荐一款免费又好用的mac浏览器,洋葱浏览器Tor Browser for Mac是一款可以匿名访问网络的浏览器,同时洋葱浏览器mac版还具备隐藏IP、防监听等功能,能够很好的保护用户网络上的隐私,这里为大家最新版的tor browser,想要这款浏览器的朋友赶紧来看看吧!
https://www.mac69.com/mac/2231.html
洋葱浏览器mac版安装教程
下载好Tor Browser安装包后,点击打开Tor Browser.dmg,将左侧【Tor Browser】拖拽至右侧应用程序,即可使用。
tor browser for mac软件介绍
在Tor的软件通过一个由志愿者在世界各地运行中继的分布式网络弹跳您的通讯保护你:它可以防止有人看从学习你所访问的网站您的Internet连接,它可以防止你从你的物理位置访问的站点,并它允许您访问被阻止的网站。
https://www.mac69.com/mac/2231.html
Tor Browser允许您在Microsoft Windows,Apple MacOS或GNU / Linux上使用Tor,而无需安装任何软件。它可以运行USB闪存驱动器,配备预先配置的Web浏览器以保护您的匿名性,并且是独立的(便携式)。
https://www.mac69.com/mac/2231.html
tor browser mac版功能特点
Tor Browser是个内建「翻墙」功能的网路浏览器,藉由「洋葱路由,洋葱路由器(Tor)」匿名浏览技术,将上网时所传递的讯息层层加密保护,让使用者在浏览 网站时不被监控或侧录,也无法查处原本的IP位址或追踪真实的使用者身份。
Tor Browser是个相对安全一些但速度没法太快的匿名上网服务,没法拿来下载BT或其他P2P,用来看高画质的线上影片也会吃力些,但相对于其他类似服务来说就是安全许多。
Tor Browser的本体是个修改,强化过的Mozilla Firefox浏览器,除了整合了Tor相关功能之外,还预设启用了HTTPS Everywhere与NoScript等扩充套件,藉起停用JavaScript,Flash,Silverlight,Java ...与 某些特殊的控制码来避免某些设计绕过Tor而取得你的真实IP与相关资讯,并以强制HTTPS加密连线的方式大幅提升上网时的安全性。
画过渡效果对于程序的重要性是毋容置疑的,过渡动画的流畅真的能给人一种程序很顺畅的感觉。ios系统基本上不管是什么操作都喜欢运用动画过渡,所以给人一种超流畅的感觉!在项目中我们也会经常被要求在元素切换,界面过渡中添加动画过渡效果。可是自己写的话真的超级麻烦,如果有一款强大的动画库岂不是很爽。
animate.css 是一个css3动画库,包含76种动画,并且完全免费开源,可以到github上去下载,使用方法也非常简单,并且因为是css库的原因,完全兼容 H5,小程序以及uni-app。
官网:https://daneden.github.io/animate.css/
gitHnb: https://github.com/daneden/animate.css
npm安装:
npm install animate.css --save
yarn安装:
yarn add animate.css
CDN引入
https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css
在各个不同的环境中,引入方法有细微的区别,但是基本上大同小异。
animate.css 的使用非常简单,因为它是把不同的动画绑定到了不同的类里,所以想要使用哪种动画,只需要把通用类 animated 和相应的类添加到元素上就行了。
所以说,我们想切换操作不同的动画,只需要用 css 来给需要动画的那个元素来添加,删除不同的类即可。
以下是 animate.css 提供的动画类列表:
当然,除了动画之外,我们还可以给动画元素添加其它的类来控制动画执行时间,是否无限循环,延迟时间等。
至于具体的功能,还是推荐大家去看官方文档,同时它的官网可以预览到各个动画类的具体效果;https://daneden.github.io/animate.css/。
*请认真填写需求信息,我们会在24小时内与您取得联系。