【附源碼】Electron Windows桌面壁紙開發中的 CommonJS 和 ES Module 引入問題以及 Webpack 如何處理這種兼容

背景

在嘗試讓 ChatGPT 自動開發一個桌面壁紙更改的功能時,發現引入了一個 wallpaper 庫,這個庫的入口文件是 index.js,但是 package.json 文件下的 type:"module",這樣造成了無論你使用 import from 還是 require,都會報 ES Module 引入錯誤,針對于這個問題,讓 GPT 給了很多方案,但是都沒有解決實質問題,最終,經過多次測試,發現必須借助打包工具 webpack 才能搞定這個事情。

案例代碼

node version:16

這個是用的wallpaper庫,這個庫有bug,雙屏幕失效

simple-electron-demo: 從一個簡單的electron初始庫開始從零解說electron的運行過程 - Gitee.com

另外在B站上看到一個視頻也是搞壁紙的,對方的代碼無法運行 node:18 作者也沒修復,里面看用的koffi 調用一個dll,這個dll估計是作者自己打的動態連接庫,但是這個沒有地方可以控制伸縮,代碼也放在這里

simple-electron-demo: 從一個簡單的electron初始庫開始從零解說electron的運行過程 - Gitee.com

B站視頻連接(作者堆了一堆buffer,然后把代碼搞到build報錯,實際上一個前端開發真沒必要用typescript和vue3這些東西,尤其是vite,給開發帶不來任何效率提升,卻外加了很多不必要學習的知識,就是前端內卷的一種方式吧)

Vue3+electron實現桌面壁紙更換2.0版本(已完成macOS靜態壁紙更換,后續功能開發中)_嗶哩嗶哩_bilibili

Electron 官網對 ES Module 的建議

Electron中的 ES 模塊 (ESM) | Electron

沒有看太懂,大概就是必須開啟 type:"module",然后引入的 js 必須是.mjs后綴,否則就會報錯,另外大家就是講了在哪些情況,你開了 module 就會導致渲染進程無法訪問 node_modules 中的文件,也無法訪問 node api 接口

一個 ES Module 庫:wallpaper

它的入口文件是 index.js 而 package.json 中 type 設為 module,這就使得引入這個庫的 wallpaper 也得支持 type:"module",否則無法使用這個庫,一般像 vue,都會給兩個字段,一個是 main,一個是 module,以任意一種項目選擇性引入

那么 ES Module 怎樣才能正常使用?

  1. webpack 打包后的代碼一般我們從來都不會遇到這種 ES Module 的問題,原因是 webpack 打包會把所有的代碼都進行預編譯整合,也即將代碼從 node_module 拷貝出來,然后再經過 babel 等的轉化,塞入打包后的代碼里,最后統一用 require 的方式進行引入

  2. 而基于 electron 的開發,所有的 js 都可以取自本地,因為基于 commonJS 協議的方式更符合開發本地開發方式,因此 Webpack 可以把一些代碼不打包進去,直接保留 require("vue") 引入方式,這樣不但降低了最終打包文件的體積大小,還能動態的引入所需的代碼,整體性能就很高

  3. 所以白名單這里就是不讓 webpack 打包,默認整個生產依賴都要打包進去

  4. 但是 wallpaper 默認是 ES Module 就必須轉化成 CommonJS 形式,于是就把代碼進行預編譯,然后塞到 main.js 中去,這樣 wallpaper 整個源碼就被構建進去了,也就不存在原來 type:"module"引入的概念

總結

  1. webpack打包 electron 都是基于 CommonJS 方式,使用的是 require 來引入

  2. 如果遇到 ES Module 模塊,則將其加入到 whiteListModules 列表中,直接打包到 webpack 里面即可

  3. 其他沒有什么好辦法,能讓 electron 既支持 CommonJS 又支持 ES Module,兩者天然沖突

  4. 也沒有必要去理解這方面的問題,因為大部分情況,都被 webpack 搞定了

  5. 除非你自己想從零構建一個純粹的 ES Module 項目,但是只要你給別人用,或者引用別人的代碼,那么要改后綴名為.cjs,目前我覺得你是得頭大的

  6. 無論是源碼用了多少 import from 的寫法,webpack 最終都是給你整合成 require,fetch 的方式來搞事情

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63318.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63318.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63318.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【計算機網絡篇】計算機網絡期末復習題庫詳解

🧸安清h:個人主頁 🎥個人專欄:【計算機網絡】【Mybatis篇】 🚦作者簡介:一個有趣愛睡覺的intp,期待和更多人分享自己所學知識的真誠大學生。 目錄 🎯單選 🎯填空 &am…

JS使用random隨機數實現簡單的四則算數驗證

1.效果圖 2.代碼實現 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

GIN中間件

感覺中間件是gin中挺重要的內容&#xff0c;就拿出來單獨講講吧&#xff01; 什么是中間件&#xff1f; Gin框架允許開發者在處理請求的過程中&#xff0c;加入用戶自己的 HandlerFunc 函數。 它適合處理一些公共的業務邏輯&#xff0c;比如登錄認證、權限校驗、數據分頁、記…

SLM510A系列——24V,15到150mA單通道可調電流線性恒流LED驅動芯片

SLM510A 系列產品是單通道、高精度、可調電流線性恒流源的 LED 驅動芯片&#xff0c;在各種 LED 照明產品中非常簡單易用。其在寬電壓輸入范圍內&#xff0c;能保證極高的輸出電流精度&#xff0c;從而在大面積的光源照明中&#xff0c;都能讓 LED 照明亮度保持均勻一致。 由于…

回歸預測 | MATLAB實現SVM-Adaboost集成學習結合支持向量機多輸入單輸出回歸預測

回歸預測 | MATLAB實現SVM-Adaboost集成學習結合支持向量機多輸入單輸出回歸預測 目錄 回歸預測 | MATLAB實現SVM-Adaboost集成學習結合支持向量機多輸入單輸出回歸預測基本介紹程序設計基本介紹 SVM-Adaboost集成學習是一種將支持向量機(SVM)與AdaBoost算法相結合的集成學習…

【潛意識Java】深度解讀JavaWeb開發在Java學習中的重要性

目錄 為什么Java Web開發如此重要&#xff1f; 1. 現代開發的核心技能 2. 增強系統設計與架構思維 3. 實戰經驗積累 Java Web開發的關鍵技術棧 案例&#xff1a;構建一個簡單的Java Web應用 1. 創建數據庫 2. 創建Java類 3. 創建數據庫連接工具類 4. 創建DAO類 5. 創…

如何在 .NET Core 中輕松實現異步編程并提升性能

目錄 初識異步編程 與多線程關系 異步編程操作 初識異步編程 異步編程&#xff1a;是指在執行某些任務時程序可以在等待某個操作完成的過程中繼續執行其他任務&#xff0c;而不是阻塞當前線程&#xff0c;這在處理I/O密集型操作(如文件讀取、數據庫查詢、網絡請求等)時尤為重…

麒麟操作系統服務架構保姆級教程(二)ssh遠程連接

如果你想擁有你從未擁有過的東西&#xff0c;那么你必須去做你從未做過的事情 作為一名成熟運維架構師&#xff0c;我們需要管理的服務器會達到幾十臺&#xff0c;上百臺&#xff0c;上千臺&#xff0c;甚至是上萬臺服務器&#xff0c;而且咱們的服務器還不一定都在一個機房&am…

159.等差數列的劃分

class Solution {public int numberOfArithmeticSlices(int[] nums) {int lenums.length;if(le<3){return 0;}int arith0,res0,count0;//arith是差的大小,res是結果,count計算等差數量for(int i1;i<le;i){if(nums[i]-nums[i-1]arith){count;if(count>2){rescount-1;}}…

RabbitMQ消息隊列的筆記

Rabbit與Java相結合 引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在配置文件中編寫關于rabbitmq的配置 rabbitmq:host: 192.168.190.132 /…

請求三方http工具

請求三方接口工具封裝 實現邏輯&#xff1a; 發起請求&#xff0c;輸入基本請求信息&#xff1a;請求地址&#xff0c;請求類型&#xff0c;請求參數&#xff0c;是否需要認證工具自動為需要添加認證的請求添加認證&#xff0c;如果發現token快要過期或返回的錯誤編碼為定義的…

HP服務器開啟性能模式

ENERGY PERF BIAS CFG 模式指的是通過特定配置(通常是 BIOS 或操作系統中的設置)來控制處理器的能源性能偏置(Energy Performance Bias, EPB)。EPB 是一種機制,允許用戶或系統管理員在性能和功耗之間進行權衡。不同的設置可以影響系統的響應速度、能效等。 ENERGY PERF B…

調用釘釘接口發送消息

調用釘釘接口發送消息 通過創建釘釘開放平臺創建H5小程序&#xff0c;通過該小程序可以實現向企業內的釘釘用戶發送消息&#xff08;消息是以工作通知的形式發送&#xff09; 1、目前僅支持發送文本消息&#xff0c;相同內容的文本只能成功發送一次&#xff0c;但是接口返回發…

純css 實現呼吸燈效果

開始效果 呼吸效果 實現代碼 <div class"container"><div class"breathing-light"></div> </div><style>html,body {height: 100%;background-color: white;}.container {padding: 100px;}.container .breathing-light {wi…

進程通信方式---共享映射區(無血緣關系用的)

5.共享映射區&#xff08;無血緣關系用的&#xff09; 文章目錄 5.共享映射區&#xff08;無血緣關系用的&#xff09;1.概述2.mmap&&munmap函數3.mmap注意事項4.mmap實現進程通信父子進程練習 無血緣關系 5.mmap匿名映射區 1.概述 原理&#xff1a;共享映射區是將文件…

《云原生安全攻防》-- K8s安全框架:認證、鑒權與準入控制

從本節課程開始&#xff0c;我們將來介紹K8s安全框架&#xff0c;這是保障K8s集群安全比較關鍵的安全機制。接下來&#xff0c;讓我們一起來探索K8s安全框架的運行機制。 在這個課程中&#xff0c;我們將學習以下內容&#xff1a; K8s安全框架&#xff1a;由認證、鑒權和準入控…

day08-別名-重定向-去重排序等

1.重復用touch命令創建同一份文件&#xff0c;會修改文件的時間戳。 alias命令&#xff1a; 別名 查看已有別名&#xff1a;alias [rootoldboy ~]# alias alias cpcp -i alias egrepegrep --colorauto alias fgrepfgrep --colorauto alias grepgrep --colorauto alias l.ls…

Qt WORD/PDF(四)使用 QAxObject 對 Word 替換(QWidget)

關于QT Widget 其它文章請點擊這里: QT Widget 國際站點 GitHub: https://github.com/chenchuhan 國內站點 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium庫實現 PDF 操作 Qt WORD/PDF&#xff08;二…

設計一個基礎JWT的多開發語言分布式電商系統

在設計一個分布式電商系統時&#xff0c;保證系統的可擴展性、性能以及跨語言的兼容性是至關重要的。隨著微服務架構的流行&#xff0c;越來越多的電商系統需要在多個服務間共享信息&#xff0c;并且保證服務的安全性。在這樣的場景下&#xff0c;JSON Web Token&#xff08;JW…

實踐分享 | 公共數據金融應用的理論探索與實踐研究—以人民幣銀行結算賬戶數據應用為例

摘要:公共數據具有高權威性、高準確性、高價值性以及高應用性的特點,實現公共數據的金融應用對更好服務實體經濟、防控金融風險和提升金融服務水平具有重要現實意義。本文從理論探索與實踐研究兩個層面分析了公共數據金融應用的具體問題,一方面探索性的給出了公共數據金融應…