基于 Electron, React, React-router, Typescript 一款桌面豆瓣電影應(yīng)用
源碼: github.com/Yangfan2016…
web 項(xiàng)目源碼:github.com/Yangfan2016…
作者:github.com/Yangfan2016
前言
618 在慕課網(wǎng)上淘了一個(gè) 1 元的 electron 課程,一個(gè)基礎(chǔ)的入門課,還不錯(cuò),就想著把前些日子寫的 React+Typescript 實(shí)現(xiàn)一個(gè)簡單的豆瓣電影應(yīng)用 改造下,這次也是參(cao)考(xi)騰訊視頻(mac 端 app)的 UI(騰訊視頻請給我打錢,)
先來看下最終效果
準(zhǔn)備工作
首先你要有以下的基礎(chǔ)知識
項(xiàng)目目錄
先來看下最終的目錄結(jié)構(gòu)
可以使用 treer 來生成目錄結(jié)構(gòu)
$ npx treer -i "/^(node_modules|dist|build|notes|\.git|\.DS_Store)$/" >tree.txt 復(fù)制代碼 douban-movie-electron ├─.yarnrc # yarn 的配置文件 ├─app.config.js # app 的全局配置 ├─main.js # app 的主進(jìn)程 ├─package.json ├─src # 原有 web 項(xiàng)目的源碼(這里忽略展開) | |...... ├─server # api 代理服務(wù)器 | ├─app.js | ├─package.json | └yarn.lock ├─scripts | ├─build.js | ├─start.js | └test.js ├─public | ├─favicon.ico | ├─index.html # 主窗口 | ├─manifest.json | ├─play.html # 播放窗口 | └renderer.js # 播放窗口的渲染進(jìn)程 ├─config | ├─env.js | ├─paths.js | ├─webpack.config.js | ├─webpackDevServer.config.js | ├─jest | | ├─cssTransform.js | | └fileTransform.js ├─assets # app 的logo | ├─icon.png | └logo.png 復(fù)制代碼
開發(fā)注意
需要安裝如下包依賴
"devDependencies": { "electron": "4.1.3", # electron 本體 "electron-builder": "^20.40.2", # electron 打包工具 "nodemon": "^1.18.10" # 監(jiān)聽文件,重啟 node 應(yīng)用 }
electron 包下載較慢,我們需要配置下,在項(xiàng)目里新增 .npmrc 或 .yarnrc 文件(如果你的項(xiàng)目沒有使用 sass 的話,不用設(shè)置 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/"
項(xiàng)目改造
const { app, BrowserWindow }=require('electron') const path=require("path"); app.on('ready', ()=> { // 新建一個(gè)窗口 let mainWindow=new BrowserWindow({ width: 1160, height: 720, }); // 原有的項(xiàng)目開發(fā)環(huán)境下的 devServer 的端口是 3000 ,我們這里以 url 形式把原有項(xiàng)目加載進(jìn)來 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 .'" }
# 并行執(zhí)行 $ yarn start & yarn electron-dev
推薦這個(gè)在線原型圖工具 whimsical.com/
同樣參照騰訊視頻,播放視頻時(shí),會單獨(dú)彈出一個(gè)新窗口進(jìn)行播放,在 electorn 里,就是再新建一個(gè)窗口
new BrowserWindow({ width: 1100, height: 500, titleBarStyle: "hiddenInset", });
現(xiàn)在就有一個(gè)問題,就是點(diǎn)擊主窗口的某個(gè)電影打開這個(gè)播放窗口,那么信息(例如 視頻的 src 地址)該如何傳遞內(nèi),我們從 electron 的文檔里可以找到,ipcMain 和 ipcRenderer 這兩個(gè)api,用它們進(jìn)行主進(jìn)程和渲染進(jìn)程之間的通信
項(xiàng)目生產(chǎn)環(huán)境配置
const { app, BrowserWindow }=require('electron') const path=require("path"); const isProd=process.env.NODE_ENV !=="development"; app.on('ready', ()=> { // 新建一個(gè)窗口 let mainWindow=new BrowserWindow({ width: 1160, height: 720, }); // 生產(chǎn)環(huán)境 if (isProd) { // cra 默認(rèn)的打包目錄是 build,我們生產(chǎn)環(huán)境需要這么引入 mainWindow.loadFile(path.join(__dirname, "./build/index.html")); } else { // 開發(fā)環(huán)境 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"); // 生產(chǎn)環(huán)境我們直接啟動 我們的 nodejs 服務(wù) if (isProd) { // start api server apiServer.listen(server.port, ()=> { console.log(server.url); }); } else { // 開發(fā)環(huán)境 我們直接啟動 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 端的打包配置下,詳細(xì)配置 https://www.electron.build/configuration/mac "mac": { "category": "public.app-category.video", mac 應(yīng)用程序分類 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" } },
執(zhí)行命令
$ yarn dist
安裝
打包的文件會在 dist 文件夾下,我們找到 dmg 文件,進(jìn)行安裝
安裝完成,進(jìn)行預(yù)覽,發(fā)現(xiàn) ,哎,首頁的輪播圖加載失敗了 (404),我仔查看路徑,沒有任何問題,但是發(fā)現(xiàn) 它們的路徑有一個(gè)特點(diǎn)就是都是 file:///static 開頭的(本地圖片以相對路徑引用的,其他 js css 文件也是以相對路徑引入的,只有圖片404,奇怪 )
幾經(jīng)周折,終于找到了問題,React-router 我用的是 browserRouter ,就是基于瀏覽器 history api的,改成 hashRouter ,就好了(目前原因未知 ,知道原因的小伙伴請教下)
時(shí)間有限,其他平臺的打包方式及配置,請移步到 electron-builder 官網(wǎng)
大家推薦一款免費(fèi)又好用的mac瀏覽器,洋蔥瀏覽器Tor Browser for Mac是一款可以匿名訪問網(wǎng)絡(luò)的瀏覽器,同時(shí)洋蔥瀏覽器mac版還具備隱藏IP、防監(jiān)聽等功能,能夠很好的保護(hù)用戶網(wǎng)絡(luò)上的隱私,這里為大家最新版的tor browser,想要這款瀏覽器的朋友趕緊來看看吧!
https://www.mac69.com/mac/2231.html
洋蔥瀏覽器mac版安裝教程
下載好Tor Browser安裝包后,點(diǎn)擊打開Tor Browser.dmg,將左側(cè)【Tor Browser】拖拽至右側(cè)應(yīng)用程序,即可使用。
tor browser for mac軟件介紹
在Tor的軟件通過一個(gè)由志愿者在世界各地運(yùn)行中繼的分布式網(wǎng)絡(luò)彈跳您的通訊保護(hù)你:它可以防止有人看從學(xué)習(xí)你所訪問的網(wǎng)站您的Internet連接,它可以防止你從你的物理位置訪問的站點(diǎn),并它允許您訪問被阻止的網(wǎng)站。
https://www.mac69.com/mac/2231.html
Tor Browser允許您在Microsoft Windows,Apple MacOS或GNU / Linux上使用Tor,而無需安裝任何軟件。它可以運(yùn)行USB閃存驅(qū)動器,配備預(yù)先配置的Web瀏覽器以保護(hù)您的匿名性,并且是獨(dú)立的(便攜式)。
https://www.mac69.com/mac/2231.html
tor browser mac版功能特點(diǎn)
Tor Browser是個(gè)內(nèi)建「翻墻」功能的網(wǎng)路瀏覽器,藉由「洋蔥路由,洋蔥路由器(Tor)」匿名瀏覽技術(shù),將上網(wǎng)時(shí)所傳遞的訊息層層加密保護(hù),讓使用者在瀏覽 網(wǎng)站時(shí)不被監(jiān)控或側(cè)錄,也無法查處原本的IP位址或追蹤真實(shí)的使用者身份。
Tor Browser是個(gè)相對安全一些但速度沒法太快的匿名上網(wǎng)服務(wù),沒法拿來下載BT或其他P2P,用來看高畫質(zhì)的線上影片也會吃力些,但相對于其他類似服務(wù)來說就是安全許多。
Tor Browser的本體是個(gè)修改,強(qiáng)化過的Mozilla Firefox瀏覽器,除了整合了Tor相關(guān)功能之外,還預(yù)設(shè)啟用了HTTPS Everywhere與NoScript等擴(kuò)充套件,藉起停用JavaScript,F(xiàn)lash,Silverlight,Java ...與 某些特殊的控制碼來避免某些設(shè)計(jì)繞過Tor而取得你的真實(shí)IP與相關(guān)資訊,并以強(qiáng)制HTTPS加密連線的方式大幅提升上網(wǎng)時(shí)的安全性。
畫過渡效果對于程序的重要性是毋容置疑的,過渡動畫的流暢真的能給人一種程序很順暢的感覺。ios系統(tǒng)基本上不管是什么操作都喜歡運(yùn)用動畫過渡,所以給人一種超流暢的感覺!在項(xiàng)目中我們也會經(jīng)常被要求在元素切換,界面過渡中添加動畫過渡效果。可是自己寫的話真的超級麻煩,如果有一款強(qiáng)大的動畫庫豈不是很爽。
animate.css 是一個(gè)css3動畫庫,包含76種動畫,并且完全免費(fèi)開源,可以到github上去下載,使用方法也非常簡單,并且因?yàn)槭?strong>css庫的原因,完全兼容 H5,小程序以及uni-app。
官網(wǎng):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
在各個(gè)不同的環(huán)境中,引入方法有細(xì)微的區(qū)別,但是基本上大同小異。
animate.css 的使用非常簡單,因?yàn)樗前巡煌膭赢嫿壎ǖ搅瞬煌念惱铮韵胍褂媚姆N動畫,只需要把通用類 animated 和相應(yīng)的類添加到元素上就行了。
所以說,我們想切換操作不同的動畫,只需要用 css 來給需要動畫的那個(gè)元素來添加,刪除不同的類即可。
以下是 animate.css 提供的動畫類列表:
當(dāng)然,除了動畫之外,我們還可以給動畫元素添加其它的類來控制動畫執(zhí)行時(shí)間,是否無限循環(huán),延遲時(shí)間等。
至于具體的功能,還是推薦大家去看官方文檔,同時(shí)它的官網(wǎng)可以預(yù)覽到各個(gè)動畫類的具體效果;https://daneden.github.io/animate.css/。
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。