ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Joplin 多端应用源码构建指南:从 Yarn Workspaces 单仓到桌面、CLI、移动端与 Web 的完整实践

Joplin 多端应用源码构建指南:从 Yarn Workspaces 单仓到桌面、CLI、移动端与 Web 的完整实践 Joplin 多端应用源码构建指南从 Yarn Workspaces 单仓到桌面、CLI、移动端与 Web 的完整实践【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin本文以 Joplin 官方构建文档 readme/dev/BUILD.md 为骨架系统讲解如何从源码构建并本地运行 Joplin 的各端应用桌面版Electron、CLI 版、移动端Android/iOS以及浏览器中的 Web 版。读完后你将掌握 monorepo 下的依赖安装、各子包的开发启动命令、TypeScript 监听编译机制以及通过源码定位常见构建问题的排查方法。一、仓库形态Yarn Workspaces Lerna 管理的单仓MonorepoJoplin 源码采用 monorepo 组织使用Yarn workspaces管理多包依赖并用Lerna负责包的发布版本号管理。根目录 package.json 中的关键配置印证了这一点workspaces: [packages/*]packages/下每个子目录都是一个独立工作区packageManager: yarn4.16.0与enginesnode 22.12、yarn 4.14.1声明了仓库所需的 Node 与 Yarn 版本下限postinstall: husky gulp build根目录执行yarn install时会自动触发一次 gulp 构建流程因此首次安装耗时较长属正常现象。官方文档中列出的主要子包如下继承自原文档包名说明app-cliCLI 应用app-clipper网页剪藏扩展Web Clipperapp-desktop桌面应用app-mobile移动端应用lib核心库被所有应用共享负责同步、加密、导入导出、数据库及几乎全部业务逻辑rendererJoplin 的 Markdown/HTML 渲染器tools构建应用及其他任务的工具集此外还存在若干以fork-*命名的外部包 fork如 fork-htmlparser2、fork-sax、fork-uslug用于在不完全受制于上游的前提下定制行为。从源码结构看各应用对核心能力的依赖通过包版本约束体现例如 packages/app-desktop/package.json 中依赖了joplin/lib、joplin/renderer、joplin/editor等~3.7的同仓包这正是 workspaces 内部互相引用、统一版本的基础。二、安装构建依赖devbox.json 与环境准备所有构建所需依赖都集中列在仓库根目录的 devbox.json 文件中。你可以按该清单手动安装也可以在 Linux 或 macOS 上使用 Devbox 自动安装devbox shell若尚未安装 Devbox请按其官方快速入门文档完成安装。进入devbox shell后初始化脚本init_hook会打印三条快捷提示构建yarn install、运行桌面版、运行 CLI 版以及用bat查看完整构建说明——这与本文的命令完全对应。从 devbox.json 实际内容看预装工具链包括依赖版本/平台限定用途说明nodejs24.12.0满足根 package.jsonnode 22.12的要求yarn1.22.19提供基础 Yarn仓库实际通过packageManager字段指定 Yarn 44.16.0两者版本差异属于仓库现状以根 package.json 声明为准git2.52.0版本控制python3.14.3供原生模块编译node-gyp 等使用cocoapods仅 darwin 平台iOS 构建所需的 CocoaPodsvips.dev仅 aarch64-darwin图片处理相关libvipselectron排除 darwin 平台Linux 下预装 Electron 运行环境pkg-config、batlatest构建辅助工具补充说明如果你要开发onenote-converter包OneNote 文件导入转换器见 packages/onenote-converter还需要额外安装 Rust 工具链rustup因为该包使用 Rust 编写解析器parser/、renderer/目录下为 Rust 源码。一个重要的实操约束项目目录路径中不能包含空格否则构建可能失败。三、核心构建步骤yarn install完成环境准备后从项目根目录执行yarn install这是后续所有运行步骤的前置条件。由于根 package.json 配置了postinstall: husky gulp build安装完成后会自动执行 gulp 构建任务含各子包资源的准备工作无需额外手动步骤。从根 package.json 的resolutions字段还能看到仓库对众多依赖做了补丁patch与版本锁定例如对react-native、pdfjs-dist、多个react-native-*组件的补丁引用.yarn/patches/下的本地补丁文件——这意味着 Joplin 对依赖树有精细的定制手动改动yarn.lock时需要格外小心。四、运行桌面应用Electroncd packages/app-desktop yarn start从 packages/app-desktop/package.json 可以看到start脚本的实际展开gulp before-start electron . --env dev --log-level debug --open-dev-tools --no-welcome即先执行before-startgulp 任务构建前端资源再以开发模式--env dev启动 Electron并自动打开 DevTools、以 debug 日志级别输出。两点官方明确提示Windows 上请使用常规命令提示符或 PowerShell开发不要使用 WSL官方不支持该场景。原因见 readme/dev/build_troubleshooting.mdWSL 层可能导致难以调试的问题甚至锁住node_modules中的文件应用崩溃后需重启电脑才能解锁同理TypeScript watch 命令也不应放在 WSL 中运行。若要产出发布安装包而非本地调试对应命令是yarn dist即gulp before-dist yarn electronRebuild npx electron-builder按package.json中build字段配置产出 NSIS/PortableWindows、DMG/pkg/zipmacOS、AppImage/debLinux。yarn dist在 Windows 上失败时可能需要管理员权限具体排查见后文构建故障排查。五、运行终端CLI应用cd packages/app-cli yarn startpackages/app-cli/package.json 中start脚本定义为gulp build -L node build/main.js --stack-trace-enabled --log-level debug --env dev即先通过 gulp 构建 CLI 产物到build/目录再以开发模式运行build/main.js启用堆栈跟踪与 debug 日志。若已完成构建、只想快速启动也可以直接使用同包中的start-no-build脚本跳过 gulp 构建步骤。六、运行移动端应用移动端基于 React Native。首次开发前需要先按 React Native 官方教程的 React Native CLI Quickstart 完成原生开发环境配置Android Studio / Xcode / CocoaPods 等。6.1 Android在 Android 模拟器或真机已连接adb 可见的前提下cd packages/app-mobile/android ./gradlew installDebug # Windows 下使用 gradlew.bat installDebug该命令会构建 debug 版 APK 并直接安装到已连接的设备上。6.2 iOSiOS 侧需要执行pod install而它不会在构建时自动执行因为耗时过长有两种方式构建时使用环境变量RUN_POD_INSTALL1 yarn install或手动在packages/app-mobile/ios目录执行pod install完成后用 Xcode 打开packages/app-mobile/ios下的Joplin.xcworkspace注意是 workspace 而非 projectCocoaPods 的依赖在 workspace 中并从 Xcode 运行应用。通常bundler会随应用自动启动如果没有在packages/app-mobile目录手动执行yarn start即react-native start --reset-cache。6.3 在 Web 浏览器中运行移动端react-native-webcd packages/app-mobile yarn serve-webyarn serve-web启动开发服务器端口为8088见 packages/app-mobile/web/webpack.config.ts 中 devServer 的port: 8088配置。源码文件变更后构建版会整页自动刷新。如需组件级热更新hot reload改用yarn serve-web-hot-reload从 packages/app-mobile/package.json 可见它等价于yarn serve-web --env HOT_RELOADwebpack 配置在开启热更新时额外挂载ReactRefreshWebpackPlugin与react-refresh/babel插件实现局部刷新。生成发布构建执行yarn web产物输出到packages/app-mobile/web/distwebpack--mode production构建后复制web/public/*静态资源。注意与 iOS/Android 构建相同的前提Web 构建同样需要先把 TypeScript 编译为 JS参见下文监听文件一节。webpack 配置中还将react-native别名为react-native-web并把指纹识别、相机、分享等一批原生模块映射到空 mockweb/mocks/empty.js以适配浏览器环境——这也是移动端代码能够直接在浏览器里跑起来的原理所在。七、构建网页剪藏扩展Clippercd packages/app-clipper/popup npm run watch # 监听源码变更并自动重新构建在浏览器中加载解压/开发版扩展进行测试时请按 Firefox / Chrome 各自的 WebExtension 开发文档操作。一个关键限制开发模式的剪藏扩展只会连接开发实例的桌面应用反之亦然因此测试时两边必须同时是 dev 版本否则无法握手。从 packages/app-clipper/package.json 看该包在 monorepo 中的build脚本仅为cd popup npm install扩展自身的构建体系独立放在popup/子目录内。八、监听文件TypeScript 增量编译修改应用代码后任何被你改动的 TypeScript 文件都需要重新编译。最简单的方式是从项目根目录运行监听命令yarn watch从根 package.json 看它实际执行yarn workspaces foreach --worktree --parallel --verbose --interlaced --jobs 999 run watch即在所有工作区并行触发各自的watch脚本各包的watch通常是tsc --watch --preserveWatchOutput --project tsconfig.json见各包 package.json。如果你只需要一次性编译而不持续监听效果等价的是yarn tsc移动端专属说明如果你修改的是笔记编辑器、查看器或其他 WebView 内容请在packages/app-mobile目录额外执行yarn watchInjectedJs该命令对应 gulpfile 中的watchInjectedJs任务见 packages/app-mobile/gulpfile.ts会在源码变更时重新构建注入 WebView 的 JavaScript 文件——移动端应用是把一段 JS 注入原生 WebView 运行的只跑根目录yarn watch不足以让 WebView 内容生效。TypeScript 在 Joplin 中的编译策略Joplin 最初用 JavaScript 编写后来逐步迁移到 TypeScript官方要求新类和新文件一律使用 TypeScript。其编译策略非常务实所有编译产物直接生成在对应的.ts/.tsx文件旁边例如lib/MyClass.ts对应生成的lib/MyClass.js。这样设计是为了让 TypeScript 能以最小改动融入既有的 JavaScript 代码库——无需改 import 路径JS 与 TS 可以长期混用。九、以附加参数运行应用对桌面版或 CLI 版可以在yarn start命令后通过--追加参数yarn start --debug--之后的 flag 会透传给应用本体。结合各包start脚本已内置的参数桌面版--env dev --log-level debug --open-dev-tools --no-welcomeCLI 版--stack-trace-enabled --log-level debug --env dev你可以在此基础上追加自己的日志级别、环境变量等参数进行调试。十、构建故障排查要点官方故障排查文档为 readme/dev/build_troubleshooting.md与本文构建流程强相关的高频问题包括Windows 桌面版yarn dist失败时可能需要管理员权限遇到error MSB8020: The build tools for v140 cannot be found可尝试指定其他 toolset 版本安装各种 MSBUILD 错误如MSB3428通常源于构建环境不完整建议安装windows-build-tools并正确设置环境变量。Linux / macOS 桌面版Electron 启动报libgconf-2.so.4缺失时安装libgconf-2-4node-gyp 相关错误可手动npm install -g node-gyp新拉代码后出现意外的依赖错误可执行npm run clean后重装若因缺少 Python 导致原生模块如 sqlite3预编译二进制下载失败安装 Python 后重试。窗口打不开或白屏这通常意味着早期初始化出错。排查手段包括在ElectronAppWrapper见 packages/app-desktop/ElectronAppWrapper.ts中将debugEarlyBugs置为true强制显示窗口与 console 以捕获错误关闭所有已打开的 Joplin 实例残留的 dev 实例可能引发无报错的白屏删除node_modules重建最后手段是重启电脑。iOS CocoaPods 报错若出现Pods-Joplin.debug.xcconfig: unable to open file一类错误在ios目录执行pod deintegrate后再pod install重建 Pods。小结Joplin 的构建体系可以概括为devbox 提供统一工具链 → 根目录yarn install完成 workspaces 依赖安装与初始 gulp 构建 → 按目标端选择对应的yarn start/gradlew installDebug/ Xcode CocoaPods /yarn serve-web启动 → 根目录yarn watch持续编译 TypeScript移动端 WebView 内容需yarn watchInjectedJs。所有命令均设计为跨平台可用配合 readme/dev/build_troubleshooting.md 中的排查清单即可覆盖桌面、CLI、Android、iOS 与 Web 五条开发调试路径。【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表