技术解读
CircuitJS1 离线版:把浏览器里的电路实验室装进口袋
项目背景与痛点
Falstad 的 Circuit Simulator 是很多电子工程师和物理教师的“启蒙工具”:拖几个电阻电容、接上示波器,几秒钟就能看到 RC 充放电曲线。但它长期以网页形态存在,核心入口是 falstad.com 上的在线页面。这个形态在课堂投影、机房演示、出差路上做拓扑速验时,都会带来问题——没网就意味实验无法进行。
社区里不缺“把网页打包成桌面应用”的尝试,但大多数只是给 Chromium 套个壳,代价是本地文件读写、窗口状态、剪贴板、多实例这些原生能力全部丢失,最后变成一个“离线但难用”的浏览器。SEVA77/circuitjs1 的价值就在于此:它用定制版 NW.js 做外壳,把 CircuitJS1 变成真正意义上的 standalone 应用——双击即开、断网可用、能直接读写本地电路文件。这不是炫技,而是把一个教学工具从“网页”拉回“软件”的形态。
核心技术揭秘
要理解这个仓库,必须先看清它继承的技术债与红利。CircuitJS1 的源码主体是 Java,通过 GWT(Google Web Toolkit) 编译成 JavaScript 在浏览器里跑。也就是说,你在界面上看到的每一个元件、每一次矩阵求解,源头都是 Java 类。这个选择在 2010 年代很聪明:算法层与 UI 层同语言,工程师不用在 JS 里手写数值代码;代价是构建链沉重,调试只能对着混淆后的 JS,GWT 生态如今也基本停更。
电路求解走的是经典的 改进节点分析(MNA):把电路抽象成 G·v = i 的线性方程组,节点电压是未知量,独立电压源额外引入支路电流作为未知量。难点从来不在“列方程”,而在“解方程”:
- 非线性元件(二极管、BJT、MOS)用 Newton-Raphson 迭代线性化,每轮把器件替换成“等效电导 + 等效电流源”的伴随模型,重新装配矩阵;
- 动态元件(电容、电感)用梯形法或后向欧拉离散,历史状态折算成历史电流源注入右端项;
- 矩阵求解靠 LU 分解,并在稀疏结构上做优化;
- 时间步长自适应:一旦迭代不收敛或残差超限,就缩小步长重算,避免在开关瞬间“炸掉”。
数据流可以概括为下面这条闭环:
值得单独说的是元件模型的设计:CircuitElm 是抽象基类,电阻、电容、晶体管各自实现 doStep、calculateCurrent、getVoltageDiff 等钩子,渲染与仿真逻辑绑在同一个对象上。这种“元件即对象、状态即字段”的做法牺牲了模型与视图的彻底解耦,却换来了极高的开发效率——加一个新器件,基本就是写一个子类。
功能亮点与差异
第一,电路文件是纯文本。 CircuitJS1 的 .circuitjs.txt 一行描述一个元件,字段顺序固定、人类可读。这一点被严重低估:它意味着电路可以被脚本批量生成、可以进 Git 做 diff、可以在 CI 里做“拓扑回归”。很多同类模拟器的工程文件是二进制或 XML 黑盒,天然拒绝版本控制。
第二,离线 + 原生文件系统。 NW.js 把 Node 运行时塞进 Chromium,应用可以直接调 fs 读写任意路径,配合定制外壳,窗口尺寸、最近打开记录这些状态都能持久化。这正是纯浏览器方案做不到的。
第三,交互式探针与实时波形。 相比 SPICE 那套“写网表、跑批处理、看输出文件”的流程,CircuitJS1 是所见即所得的:拖动探针即可看任意两点波形,改参数立刻重算。对教学和快速验证,这个反馈回路短得多。
第四,SPICE 网表的有限导入。 它提供了对常见 SPICE 子集的解析,能把一部分外部网表拉进来做可视化,算是与专业工具之间的一座便桥。
应用场景与落地建议
适合的场景很明确:课堂教学与演示、硬件工程师做拓扑级速验(比如滤波器的截止频率、分压网络、简单放大器的偏置点)、无网环境的现场排障。如果你只是要确认“这个 RC 时间常数对不对”,它比打开 LTspice 快十倍。
但要上生产环境,有几条红线得先划清楚:
- 它不是精密仿真器。 器件模型是简化的,没有工艺角、没有温度模型、没有寄生参数。别拿它做电源环路稳定性或 IC 级验证。
- 浮空子网是雷区。 MNA 要求每个节点对地有直流通路,孤立的子电路会导致矩阵奇异。工程上要么加高阻对地电阻,要么在建模时就把参考点接好。
- 理想电压源环路会直接崩。 两个理想电压源并联、或电压源与电感构成纯环流回路,方程无解。换用带内阻的等效模型。
- GWT 产物不要轻易改。 要改行为,优先改 Java 源码后重新编译;直接改
war/下的 JS 是给自己挖坑。
如果把它的文本电路格式接进自动化流水线——比如用脚本生成一批参数扫描电路、批量跑仿真、提取波形特征做断言——它能变成一个轻量的“电路单元测试框架”,这是它被低估的工程价值。
综合评价
优点: 离线可用、零安装依赖;MNA + Newton-Raphson 的求解链路经典且实现相对干净;元件模型的可扩展性好;文本电路格式对版本控制和脚本化极其友好;交互反馈速度是同类工具里的第一梯队。
缺点: 技术栈明显老化,GWT 编译链维护成本高、调试体验差;UI 停留在十年前的审美与交互习惯;缺少自动化测试与 CI,发布靠手工打包;单维护者模式意味着长期演进存在不确定性;仿真精度与收敛鲁棒性无法与专业 SPICE 相比。
一句话结论: 它是一个“形态正确”的工具——把最好的教学电路模拟器从浏览器里解放出来,代价是承接了 GWT 时代的技术债。对教学与快速验证,它足够好;对严肃的工程仿真,请老老实实回到 SPICE。

评论