整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          把你的 web 網(wǎng)頁改造為PC App就這么容易

          把你的 web 網(wǎng)頁改造為PC App就這么容易

          你的 web 網(wǎng)頁改造為 Electron App

          基于 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ǔ)知識

          • web 的基礎(chǔ)知識(html,css,JavaScript)
          • nodejs 的 http 部分的知識(搭建簡單的 web 服務(wù)器),
          • electron 的基礎(chǔ)知識(搭建簡單的electron demo、主進(jìn)程和渲染進(jìn)程的通信)

          項(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)目改造

          • 首先寫一個(gè)簡單的 electron-demo
          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');
          });
          
          • 然后我們配置 package.json 腳本(nodemon 會監(jiān)聽你的文件變化,重新啟動 electron,不用你每次啟動)
          "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í)行如下命令
          # 并行執(zhí)行
          $ yarn start & yarn electron-dev
          
          • 由于是app,和web不同,所以我們要優(yōu)化下樣式,畫個(gè)原型圖先

          推薦這個(gè)在線原型圖工具 whimsical.com/

          • 然后我們實(shí)現(xiàn)下細(xì)節(jié),就可以看到如下效果了

          • 把之前的播放器彈出框改造

          同樣參照騰訊視頻,播放視頻時(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)境配置

          • 生產(chǎn)環(huán)境
          • 由于 electron 使用的是 file 協(xié)議,所以我們最后運(yùn)行的就不能以 url 的形式加載了,改造如下
          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');
           }
          });
          
          • nodejs api 服務(wù)改造 我們需要把 nodejs 的啟動文件引入進(jìn)來,這樣在生產(chǎn)環(huán)境下就不需要單獨(dú)啟動了
          1. 首先我們把 nodejs 的啟動 app 暴露出來
          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;
          
          1. 然后我們在 main.js 中引入
          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

          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ū)別,但是基本上大同小異。

          • 在使用webpackh5中引入上是把它引入到 main.js 中。
          • 微信小程序的開發(fā)環(huán)境中,將下載好的 animate.css 引入到 app.wxss中即可,引入之前別忘了將后綴改為.wxss eg: @import './animate.wxss';
          • 在uni-app中引入也非常簡單,將下載好的 animate.css 引入到 App.vue中即可。

          使用方法

          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/。


          主站蜘蛛池模板: 精品久久国产一区二区三区香蕉 | 精品一区二区三区无码免费视频 | 香蕉视频一区二区| 蜜芽亚洲av无码一区二区三区| 制服中文字幕一区二区| 国产区精品一区二区不卡中文| 亚洲av综合av一区二区三区| 精品一区二区三区在线观看l | 综合久久一区二区三区| 天美传媒一区二区三区| 亚洲一区中文字幕| 精品一区二区三区免费毛片爱| 日韩精品一区二三区中文| 国产福利一区二区三区视频在线| 亚洲视频一区二区在线观看| 天堂va视频一区二区| 久久国产精品最新一区| 日本一道一区二区免费看| 秋霞无码一区二区| 亚洲国产激情一区二区三区| 加勒比无码一区二区三区| 久久精品国产一区二区三区肥胖| 一区二区在线免费视频| 国产主播一区二区三区在线观看| 日韩人妻无码一区二区三区99| 国产不卡视频一区二区三区| 蜜芽亚洲av无码一区二区三区| 文中字幕一区二区三区视频播放 | 日本精品高清一区二区2021| 无码av人妻一区二区三区四区| 国产一区二区电影| 久久久久久人妻一区精品| 红桃AV一区二区三区在线无码AV| 国产乱码伦精品一区二区三区麻豆| 国产在线观看一区二区三区四区 | 制服美女视频一区| 人妻内射一区二区在线视频| 日本夜爽爽一区二区三区| 色多多免费视频观看区一区| 一区二区三区精品高清视频免费在线播放| 免费无码一区二区三区蜜桃大|