夜听城嚣 夜听城嚣
首页
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 前端基建与架构
  • 专题分享

    • Git入门与开发
    • 前端面试题汇总
    • HTML和CSS知识点
  • 项目实践
  • 抓包工具
  • 知识管理
  • 工程部署
  • 团队规范
bug知多少
  • 少年歌行
  • 青年随笔
  • 文海泛舟
  • 此事躬行

    • 项目各工种是如何协作的
    • TBA课程学习
收藏

dwfrost

前端界的小学生
首页
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 前端基建与架构
  • 专题分享

    • Git入门与开发
    • 前端面试题汇总
    • HTML和CSS知识点
  • 项目实践
  • 抓包工具
  • 知识管理
  • 工程部署
  • 团队规范
bug知多少
  • 少年歌行
  • 青年随笔
  • 文海泛舟
  • 此事躬行

    • 项目各工种是如何协作的
    • TBA课程学习
收藏
  • chrome控制台怎么复制对象
  • 小程序键盘弹起后顶起自定义导航问题
  • node子进程如何输出和关闭
  • 代理域名后webpack热更新失效及解决
  • 小程序scroll-view隐藏滚动条
  • npm包相关
  • electron下载慢解决
  • electron开发踩坑
    • mac升级后git找不到
    • electron打包找不到python
    • 安装imagemin-mozjpeg失败
    • 开发中的bug类型踩坑
    • 云端web项目开发踩坑
    • 如何快速定位bug
    • bug知多少
    frost
    2022-10-01

    electron开发踩坑

    用 JS 开发跨平台桌面应用,从原理到实践 (opens new window)

    # 打包时只会将 denpendencies 的依赖打包到主进程

    所以主进程使用到的依赖,必须安装到 denpendencies 中,否则会报模块不存在。同时,渲染进程使用到的依赖,都打包到 devDependencies,以便将来分离主进程和渲染进程时处 理方便。

    # 渲染进程调用 Node API

    默认是不能调用的,需要开启设置。见文档 (opens new window)。

    new BrowserWindow({
        height: 800,
        useContentSize: true,
        width: 600,
        webPreferences: {
            contextIsolation: false,
            nodeIntegration: true, // 渲染进程可以使用Node API
            webSecurity: false,
            // 如果是开发模式可以使用devTools
            devTools: process.env.NODE_ENV === 'development',
            // 在macos中启用橡皮动画
            scrollBounce: process.platform === 'darwin'
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    # 打包后,mac 下无法识别 shell 命令

      /bin/sh: node: command not found
    
    1

    见issue (opens new window) 社区的解决方案是fix-path (opens new window)。不过要注意,在 render 进程使用 fix-path 仍会报错,暂时无法解决,只能在 main 进程中使用。

    import fixPath from 'fix-path'
    
    fixPath()
    await runCommand(projectInfo.buildSript, projectInfo.path)
    
    1
    2
    3
    4

    # Error: Module "path" has been externalized for browser compatibility. Cannot access "path.join" in client code.

    看到这个错,以为渲染进程不支持 Node API,其实并不是。测试下其他模块,如:

    const childProcess = require('child_process')
    childProcess.spawn('npm', ['-v'], { stdio: 'inherit', shell: true })
    
    1
    2

    这里出现一个小插曲,控制台报错。

    ncaught Error: spawn npm ENOENT
    
    1

    找到类似的问题,见issue (opens new window)

    打印process.env,发现竟然只有项目配置的环境变量,原来的 Node 环境变量居然没有,然后发现是在vite.config.js中配置了。

    export default defineConfig({
      mode: process.env.NODE_ENV,
      root,
      define: {
        'process.env': process.env.NODE_ENV === 'production' ? userConfig.build.env : userConfig.dev.env,
      },
    })
    
    1
    2
    3
    4
    5
    6
    7

    改下为

    export default defineConfig({
      define: {
        'process.env': process.env.NODE_ENV === 'production' ? { ...process.env, ...userConfig.build.env } : { ...process.env, ...userConfig.dev.env },
      },
    })
    
    1
    2
    3
    4
    5

    恢复正常,控制台输出 npm 版本号。

     6.14.15
    
    1

    然后进入正题,为啥不支持 path 模块。

    网上很多文章提示要安装path-browserify (opens new window),比 如vite 不支持 node 内置模块 (opens new window)。原来 webpack 已内置支持,但 vite 不支持。

    安装试试。

    npm install path-browserify -D
    
    1
    import 'path' from 'path-browserify'
    
    1

    可以正常使用了。继续往下看。果然很快又报错了,如下:

    Error: Module "fs" has been externalized for browser compatibility.
    
    1

    这下没有对应的库做兼容性处理了。不过 vite 社区也有相关插件,处理将 require 转为 import 的写法。 见vite-plugin-commonjs-externals (opens new window)。果然可以,反过来想想,它只是做了支持 import 代替 require,那 之前的 import 引入,是不是直接用 require 就可以了,比如:

    import { join, resolve } from 'path'
    
    1

    改为

    const { join } = require('path')
    
    1

    果然是可以的,不过既然vite-plugin-commonjs-externals很香,那就继续用吧。

    # renderer 打包后如何获取本地 static 文件

    打包之后,process.cwd()与开发环境不同,表现为:

    • 开发位于项目根目录
    • 打包位于 dist/electron/renderer 目录
    上次更新: 2022/10/03, 22:06:15
    electron下载慢解决
    mac升级后git找不到

    ← electron下载慢解决 mac升级后git找不到→

    最近更新
    01
    提交代码时修改commit消息
    04-09
    02
    如何快速定位bug
    02-20
    03
    云端web项目开发踩坑
    08-25
    更多文章>
    Theme by Vdoing | Copyright © 2021-2025 dwfrost | 粤ICP备2021118995号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×