最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用 electron-forge 搭建 React + Ts 的項目

 更新時間:2025年01月21日 16:52:26   作者:深坑妙脆角  
本文介紹了如何使用Electron、electron-forge、webpack、TypeScript、React和SCSS等技術搭建一個桌面應用程序,通過這篇文章,開發(fā)者可以創(chuàng)建一個包含React組件、SCSS樣式、靜態(tài)資源和Loading頁面的應用,感興趣的朋友一起看看吧

前言

如果你有桌面應用開發(fā)的需求,且比較熟悉 Web 相關的技術,那么 Electron 會是一個非常不錯的選擇,作為一個使用 Web 技術構建跨平臺桌面應用的框架,其允許開發(fā)者使用JavaScript、HTML 和 CSS 等 Web 技術來構建桌面應用;同時,Electron 擁有一個活躍的社區(qū)和豐富的生態(tài)系統(tǒng),這不僅意味著開發(fā)者可以輕松找到解決問題的資源和工具,還意味著框架的更新和改進是持續(xù)不斷的,能夠緊跟技術發(fā)展的步伐

本文將介紹如何用其構建一個應用 Demo 項目

介紹

創(chuàng)建 Electron 應用程序項目的方式有很多,如手動集成、electron-vite 快速構建等,本文將介紹通過 electron-forge 構建的方式

主要環(huán)境

  • electron-forge v7.6
  • webpack
  • react
  • typescript

Electron Forge 介紹

Electron Forge 是一個用于打包和分發(fā) Electron 應用程序的一體化工具,可以認為是 Electron Builder 的替代品,它提供了一個全面的解決方案,包括初始化項目、本地開發(fā)、打包和發(fā)布,同時,其簡化了 Electron 應用的開發(fā)和打包流程,使得開發(fā)者可以更專注于應用本身的開發(fā)

具體步驟

項目構建步驟主要如下,如果你需要源碼,可從文末獲?。?/p>

創(chuàng)建 electron 項目

在開始前,需先備有對應的工具,如:npmyarn

npm

本例使用的是npm,使用yarn的命令也差不多

通過模板創(chuàng)建項目

模板集成了一些項目構建工具,可以更為方便的為項目加入插件,主要提供了如下模板:

  • webpack
  • webpack-typescript
  • vite
  • vite-typescript

創(chuàng)建命令

選擇合適的模板后,按照下列命令創(chuàng)建項目

npm init electron-app@latest [project-name] -- --template=[template-name]
  • [project-name]:表示項目名
  • [template-name]:表示模板名,在上側提供的里面選擇

開始創(chuàng)建

本例使用命令如下:

npm init electron-app@latest demo -- --template=webpack-typescript

該模板集成了webpacktypescript的能力

如果你選用vite相關模板,需注意:

vnote

創(chuàng)建好項目后的package.json依賴內容如下:

"devDependencies": {
  "@electron-forge/cli": "^7.6.0",
  "@electron-forge/maker-deb": "^7.6.0",
  "@electron-forge/maker-rpm": "^7.6.0",
  "@electron-forge/maker-squirrel": "^7.6.0",
  "@electron-forge/maker-zip": "^7.6.0",
  "@electron-forge/plugin-auto-unpack-natives": "^7.6.0",
  "@electron-forge/plugin-fuses": "^7.6.0",
  "@electron-forge/plugin-webpack": "^7.6.0",
  "@electron/fuses": "^1.8.0",
  "@typescript-eslint/eslint-plugin": "^5.0.0",
  "@typescript-eslint/parser": "^5.0.0",
  "@vercel/webpack-asset-relocator-loader": "1.7.3",
  "css-loader": "^6.0.0",
  "electron": "33.2.1",
  "eslint": "^8.0.1",
  "eslint-plugin-import": "^2.25.0",
  "fork-ts-checker-webpack-plugin": "^7.2.13",
  "node-loader": "^2.0.0",
  "style-loader": "^3.0.0",
  "ts-loader": "^9.2.2",
  "ts-node": "^10.0.0",
  "typescript": "~4.5.4"
},
"dependencies": {
  "electron-squirrel-startup": "^1.0.1"
}

如果命令一直創(chuàng)建失敗,可能是網絡問題,可考慮使用一些鏡像站

試運行

創(chuàng)建好項目后,可以進入項目根目錄,用執(zhí)行如下命令,嘗試是否可以正常運行:

# 運行npm start

除此運行可能會報一些類型錯誤,大致如下:

Failed to load: ...\...\ele-react-demo\forge.config.ts
An unhandled rejection has occurred inside Forge:
TSError:
1. ? Unable to compile TypeScript:
forge.config.ts:1:34 - error TS2307: Cannot find module '@electron-forge/shared-types' or its corresponding type declarations.

按照錯誤提示添加上相關依賴即可,可能需要添加的依賴如下

"devDependencies": {
    "@electron-forge/shared-types": "^7.6.0",
    "@electron-forge/maker-base": "^7.6.0",
    "@electron-forge/plugin-base": "^7.6.0",
    "webpack": "^5.97.0",
    "@types/node": "^22.10.1"
}

添加完缺少的依賴后,再次運行npm start啟動項目,如運行成功,可看到如下界面

可以看到,默認會啟動開發(fā)者工具,這是由于src/index.ts內的代碼設置的,如下:

如不需要,可將其注釋或刪除,需要打開開發(fā)者工具時通過快捷鍵 Ctrl + Shift + I (windows 系統(tǒng))打開即可

試打包

當編寫好項目后,需進行打包,可運行如下命令:

# 打包
npm run make

打包好后,項目根目錄會出現一個out目錄,內部即是打包好的文件;打包會檢測本機系統(tǒng),然后生成對應的打包文件

正常打包好后,內部會有兩個目錄,一個為make目錄,里面有對應系統(tǒng)的二進制安裝程序,如exe;另一個目錄(如**-win32-x64),里面為對應系統(tǒng)的便攜式免安裝程序,點擊產品名.exe即可打開應用,此目錄內有個resource文件夾,裝著項目編譯的一些內容,如app.asar

asar 解包方法

asar文件類似一種壓縮包,通過對應的工具可以對其進行解包,得到實際的文件

  • 安裝解包工具:npm install -g asar
  • 運行命令解包:asar extract app.asar ./app (該命令會將 app.asar 解包到當前目錄的 app 目錄下)

解包后,目錄內會有如下結構:

.webpack     # 項目編譯部分
 ├- main     # electron 部分
 └- renderer # web 部分
node_modules # 項目依賴
package.json

如果你是用vite模板構建項目,文件名稱可能稍有差別,但結構大致類似

集成 React

集成 React 可以讓 UI 開發(fā)變得更為方便

安裝依賴

首先安裝對應依賴,如下:

# 安裝 React 包
npm install --save react react-dom
# 安裝 React 類型支持相關包
npm install --save-dev @types/react @types/react-dom

修改 tsconfig

修改項目根目錄下的tsconfig.json,在 compilerOptions 下添加如下內容:

"compilerOptions": {
  "jsx": "react-jsx"
}

修改項目文件

在項目內使用React組件的能力,首先在src目錄下新建文件app.tsx,內容如下:

/** src/app.tsx */
import { createRoot } from 'react-dom/client';
import { useState } from 'react';
// 主應用
function App() {
  const [count, setCount] = useState(0);
  return (
    <>
      <h1>Hello React</h1>
      <p>count: {count}</p>
      <button onClick={() => setCount(count + 1)}>count + 1</button>
    </>
  );
}
const root = createRoot(document.body);
root.render(<App />);

接著,在src/renderer.ts內導入它

render

然后,運行npm start啟動項目,正常啟動后如下

render

正常情況下,無需額外配置,項目即可實現熱重載,比如修改了app.tsx內容后保存,無需重啟項目,修改內容即可渲染出來

集成 SCSS

如果你需要使用一些 CSS預編譯器,可參考一下步驟,這里以scss舉例:

安裝依賴

需安裝sass相關依賴,如下:

npm install --save-dev sass sass-loader

配置 loader

修改項目根目錄下的 webpack.renderer.config.ts 文件,如下:

// webpack.renderer.config.ts
// ··· ···
// 加入對對應樣式文件的解析規(guī)則
rules.push({
  test: /\.(sass|scss|css)$/,
  use: [{ loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'sass-loader' }]
});
// ··· ···

使用 SCSS

重命名src目錄下的樣式文件,將index.css改為index.scss,然后即可在文件內添加scss樣式規(guī)則,例如:

/* index.scss */
body {
  h1 {
    color: #68945c;
  }
}

導入 SCSS

index.scss導入src/renderer.ts內部使用

ren

接著,npm start啟動項目,查看效果

scss

可以看到,scss的樣式已可正常渲染

配置靜態(tài)資源

如果你在項目內使用了一些靜態(tài)資源(如圖片),如下:

static

我在src目錄下新建了一個assets目錄,專門用于放置靜態(tài)資源,現在里面放了一張圖片;然后我在app.tsx內引用了它;接著啟動項目,如果沒有意外,可以看到圖片并不會顯示,控制臺會報錯找不到對應資源,查看編譯后的.webpack目錄,發(fā)現缺少沒有對應的圖片資源

這是由于靜態(tài)資源沒有被正確加載或復制,以下介紹兩種簡單可行的方式,僅供參考:

方法一

此方法僅配置打包后的靜態(tài)資源,具體步驟如下:

配置 forge.config.ts

const config: ForgeConfig = {
  packagerConfig: {
    asar: true,
    // 通過如下配置項,配置需打包的靜態(tài)資源
    // 該配置會將對應資源復制到打包后的 resource 目錄下
    // 這里表示復制 src/assets 整個目錄
    // 打包后在 out/**-win32-x64/resource 目錄下,會有一個 assets 目錄
    extraResource: ['./src/assets']
  }
}

使用時可以用相對路徑,也可以借助path工具

// src/app.tsx
function App() {
  const [count, setCount] = useState(0);
  return (
    <>
      <h1>Hello React</h1>
      // 通過相對路徑
      // 打包后的結構可看上方解答
      // web 部分在 resource/app.asar/.webpack/renderer/main_window
      // 資源部分在 resource/assets
      <img src="../../../../assets/images/cat.jpg" />
      // 也可以使用 path 拼接路徑,如:path.join(process.resourcesPath, 'assets/images/cat.jpg')
      // process.resourcesPath 表示 resource 目錄
      <p>count: {count}</p>
      <button onClick={() => setCount(count + 1)}>count + 1</button>
    </>
  );
}

此時npm run make打包后,運行打包的文件,即可看到靜態(tài)資源已經可以正常顯示了

img

這種方法只適用于處理打包的靜態(tài)資源,開發(fā)npm start運行時依舊無法正常顯示

并且,復制的靜態(tài)資源存在于 renderer 目錄下,并為打包進 app.asar

方法二

通過一些插件實現,如rollup-plugin-copy、copy-webpack-plugin等,這里介紹copy-webpack-plugin的用法

首先安裝copy-webpack-plugin插件

npm install --save-dev copy-webpack-plugin

接著配置使用插件,打開根目錄下的webpack.plugins.ts文件

plugin

以上配置會將./src/assets文件夾內的內容復制到./.webpack/renderer/static文件夾內,在項目中使用時,只需通過./static目錄進行訪問即可,如下

// src/app.tsx
function App() {
  const [count, setCount] = useState(0);
  return (
    <>
      <h1>Hello React</h1>
      // 使用靜態(tài)資源
      <img src="./static/images/cat.jpg" />
      <p>count: {count}</p>
      <button onClick={() => setCount(count + 1)}>count + 1</button>
    </>
  );
}

此時無論是開發(fā)運行npm start,還是打包npm run make運行,都能正確渲染靜態(tài)資源

make

這種方法不僅可以正常顯示與開發(fā)和打包中,同時在打包時,靜態(tài)資源也會一并打包進 app.asar 內

配置 Loading 頁面

以下內容是一些體驗優(yōu)化,參考即可

使用 electron 開發(fā),在啟動時,會有一段白屏時間,這主要是由于窗口加載后,頁面資源還未加載渲染好造成的,在項目集成了RreactVue后,這個問題會愈發(fā)明顯,白屏時間會更長

想要解決這個問題,由很多方式可以參考,如:優(yōu)化資源、做一些預加載工作等

這里主要介紹一種比較簡單的解決方式:加入 Loading 頁面,主要思路就是在主窗口創(chuàng)建前,先創(chuàng)建一個 Loading 窗口,只用顯示簡單的 Loading 頁面,然后再創(chuàng)建主窗口;窗口創(chuàng)建時默認都隱藏,當創(chuàng)建好后才顯示,首先顯示 Loading 窗口,待主窗口創(chuàng)建完成并準備好時,隱藏 Loading 窗口,展示主窗口

首先在assets目錄下新建一個loading.html,里面存放著一個loading動畫樣式,效果如下(可自行創(chuàng)意實現):

ld

接著,創(chuàng)建窗口渲染使用它,修改src/index.ts文件

// Loading 窗口
let loadingWin: BrowserWindow;
// Loading 窗口的渲染文檔,即上側的 loading 效果
const loadingUrl = path.join(__dirname, '../renderer/static/loading.html');
/** Loading 窗口 */
const createLoading = () => {
  return new Promise((resolve, reject) => {
    loadingWin = new BrowserWindow({
      // 一開始是否顯示
      show: false,
      width: 512,
      height: 512,
      frame: false, // 無邊框(窗口、工具欄等),只包含網頁內容
      transparent: true // 窗口是否支持透明,在做高級效果時最好為 true
    });
    // 當窗口顯示時
    loadingWin.once('show', () => {
      resolve(true);
    });
    // 配置窗口渲染文檔
    loadingWin.loadFile(loadingUrl);
    // 顯示 Loading 窗口
    loadingWin.show();
  });
};
/** 主窗口 */
const createWindow = () => {
  // 創(chuàng)建渲染窗口
  const mainWindow = new BrowserWindow({
    // 窗口圖標
    // icon: './assets/logo/logo.ico',
    height: 600,
    width: 800,
    // 一開始隱藏
    show: false,
    webPreferences: {
      // 預加載腳本
      preload: MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY
    }
  });
  // 主窗口準備還顯示
  mainWindow.once('ready-to-show', () => {
    // 隱藏 Loading 窗口
    loadingWin.hide();
    // 關閉 Loading 窗口
    loadingWin.close();
    // 展示 主窗口
    mainWindow.show();
  });
  // 為窗口加載 index.html
  mainWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY);
  // 打開開發(fā)者工具
  // mainWindow.webContents.openDevTools();
};
// 當 Electron 初始化完成并準備創(chuàng)建渲染窗口(mainWindow)時調用
// 某些 API 只能在此事件發(fā)生后使用
// app.on('ready', createWindow);
app.on('ready', async () => {
  // 先創(chuàng)建 Loading 窗口
  await createLoading();
  // 再創(chuàng)建 主窗口
  createWindow();
});

加入loading窗口后,白屏時間可以顯著改善,程序啟動后,會先顯示loading窗口,待主窗口完全準備好后再顯示主窗口,效果大致如下:

【一張動圖,但這放不了】

如果需要,還可以給主窗口頁面加入一個淡入的動畫效果,交互體驗也許會更好

總結

本文介紹了用electron-forge、webpack、typescript、react、scss搭建的一個模板項目,同時還包含靜態(tài)資源配置及loading效果

如果你由于網絡原因npm init創(chuàng)建electron項目一直失敗,也可以到github克隆本項目直接修改使用

git

克隆完成后到項目根目錄通過如下命令即可使用

# 安裝依賴
pnpm install
# 運行
npm start
# 打包
npm run make

參考資料

Electron Forge: https://www.electronforge.io/

模板地址: https://github.com/skmcj/demo

到此這篇關于如何使用 electron-forge 搭建 React + Ts 的項目的文章就介紹到這了,更多相關electron-forge 搭建 React + Ts 項目內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解析React?ref?命令代替父子組件的數據傳遞問題

    解析React?ref?命令代替父子組件的數據傳遞問題

    這篇文章主要介紹了React?-?ref?命令為什么代替父子組件的數據傳遞,使用?ref?之后,我們不需要再進行頻繁的父子傳遞了,子組件也可以有自己的私有狀態(tài)并且不會影響信息的正常需求,這是為什么呢?因為我們使用了?ref?命令的話,ref是可以進行狀態(tài)的傳輸
    2022-08-08
  • React從Class方式轉Hooks詳解

    React從Class方式轉Hooks詳解

    這篇文章主要介紹了React從Class方式轉Hooks詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-09-09
  • 淺談python的函數知識

    淺談python的函數知識

    這篇文章主要為大家介紹了python的函數,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • React Native:react-native-code-push報錯的解決

    React Native:react-native-code-push報錯的解決

    這篇文章主要介紹了React Native:react-native-code-push報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談react路由傳參的幾種方式

    淺談react路由傳參的幾種方式

    這篇文章主要介紹了淺談react路由傳參的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • hooks寫React組件的5個注意細節(jié)詳解

    hooks寫React組件的5個注意細節(jié)詳解

    這篇文章主要為大家介紹了hooks寫React組件的5個需要注意的細節(jié)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • React 的 getDefaultProps簡介、用法與最佳實踐方案

    React 的 getDefaultProps簡介、用法與最佳實踐方案

    React組件通過getDefaultProps設置默認屬性,防止未傳props導致的錯誤,隨著React發(fā)展,方式從方法演變?yōu)閟tatic defaultProps及函數參數默認值,建議根據項目選擇合適語法,本文給大家介紹React 的 getDefaultProps簡介、用法與最佳實踐方案,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 淺談React組件在什么情況下會重新渲染

    淺談React組件在什么情況下會重新渲染

    當我們使用React編寫組件時,組件的重新渲染是一個重要的概念,本文主要介紹了React組件在什么情況下會重新渲染,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • React?18?如何更新?state?中的對象

    React?18?如何更新?state?中的對象

    state 中可以保存任意類型的JavaScript值,包括對象,但是,不應該直接修改存放在 React state 中的對象,這篇文章主要介紹了React?18更新state中的對象,需要的朋友可以參考下
    2023-08-08
  • 使用react實現手機號的數據同步顯示功能的示例代碼

    使用react實現手機號的數據同步顯示功能的示例代碼

    本篇文章主要介紹了使用react實現手機號的數據同步顯示功能的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論

苏尼特左旗| 绿春县| 呼伦贝尔市| 安泽县| 永胜县| 怀宁县| 丰镇市| 开平市| 抚州市| 乌鲁木齐市| 漯河市| 灵丘县| 仁寿县| 沧州市| 会同县| 芷江| 信阳市| 托里县| 长治县| 澜沧| 淮北市| 德兴市| 贵定县| 读书| 河津市| 安仁县| 漳州市| 韶山市| 湖南省| 大邑县| 达拉特旗| 黄石市| 襄樊市| 甘谷县| 申扎县| 博罗县| 新宾| 屏山县| 北辰区| 海林市| 清苑县|