从 window.external 到 Mojo深度解析 Chromium 中 JS 与 C++ 的 7 种通信机制

Chromium源码阅读:Mojo实战:从浏览器JS API 到blink实现 这个API是Web标准API,肯定在blink/render下面,简单一搜就找到了:> get(> get(// Cookie Store API的解释器文档链接// 定义一个名为CookieStore的接口,它在ServiceWorker和Window环境中被暴露,Exposed=(ServiceWorker,Window), // 暴露给ServiceWorker和WindowSecureContext // 并且仅在安全上下文中可用(如HTTPS) 阅读详情

一、前言:为什么 JS ↔ C++ 通信是浏览器内核的核心问题

在很多人眼里,浏览器开发似乎分得很清楚:

  • 前端:HTML / CSS / JavaScript

  • 后端:C++ / 网络 / 系统能力

但真正做过浏览器内核开发的人都清楚一件事:

浏览器是一个“前端驱动后端”的系统

几乎所有用户行为,最终都是从 JS 开始的:

  • 点击设置页的一个按钮

  • 打开 chrome://extensions

  • 触发下载、文件选择、系统配置

  • 企业定制浏览器中调用本地能力

而这些行为,最终都必须落到 C++ 层才能完成。

因此,一个问题贯穿了整个浏览器内核设计:

JavaScript 是如何安全、可控、高性能地调用 C++ 的?

在 Chromium 的发展历史中,这个问题并没有一个“一步到位”的答案,而是逐步演进,形成了多种 JS ↔ C++ 通信方式并存的局面。

本文将从浏览器内核工程师视角,系统性梳理:

Chromium 中 JS 与 C++ 通信的 7 种方式

并结合工程实践,给出选型与演进建议。


二、理解 JS ↔ C++ 通信之前:Chromium 的架构前提

在深入具体方案之前,必须先统一一个基础认知。

2.1 多进程架构是前提条件

Chromium 采用严格的多进程模型:


几个关键结论:

  • JavaScript 永远运行在 Renderer 进程

  • 绝大多数系统能力只存在于 Browser 进程

  • JS ↔ C++ 的本质 = 跨进程通信(IPC)


2.2 所谓“通信方式”的本质差异是什么?

所有 JS ↔ C++ 的方案,最终差异都体现在:

  1. JS 从哪里调用

  2. C++ 如何暴露接口

  3. 中间通信通道是什么

  4. 安全模型是否明确

  5. 是否符合 Chromium 的长期演进方向


三、JS ↔ C++ 通信方式全景:7 种方式总览

在 Chromium / 桌面浏览器语境下,完整的 7 种方式如下:

编号方式是否直接 JS → C++
1Web 标准 API是
2Chrome Extensions API是
3window.external(V8 注入)是
4Chrome WebUI(chrome.send)是
5Mojo WebUI / Mojo JS Bindings是
6postMessage(JS ↔ JS 间接)否
7WebView / CEF 宿主桥是(非 Chromium 主线)

下面逐一展开。


四、方式一:Web 标准 API(最“正统”的通信)

4.1 示例

navigator.clipboard.readText(); navigator.geolocation.getCurrentPosition(...) 

4.2 内部调用链(简化)

JS → Blink WebIDL → Renderer C++ → Mojo → Browser Service → OS 

4.3 工程评价

优点:

  • 完全标准化

  • 安全模型成熟

  • 生命周期与页面一致

缺点:

  • 能力受限

  • 无法满足浏览器私有需求

📌 结论:

Web API 是浏览器对 Web 的承诺
不是浏览器给自己用的扩展能力


五、方式二:Chrome Extensions API(扩展通信)

5.1 示例

chrome.runtime.sendMessage({ cmd: 'readFile' }); 

5.2 调用链

Extension JS → ExtensionBindings → Mojo → Browser Extension System 

5.3 特点

  • 权限通过 manifest.json 声明

  • 生命周期独立于页面

  • IPC 封装完善

📌 结论:

适合扩展生态
不适合浏览器内置页面(chrome://)


六、方式三:window.external(历史遗产)

6.1 JS 调用

window.external.ReadFile("C:\\test.txt"); 

6.2 C++ 注入(Renderer)

void ChromeRenderFrameObserver::DidClearWindowObject() { v8::Local<v8::Object> external = v8::Object::New(isolate); external->Set(context, v8_str("ReadFile"), v8::Function::New(context, ReadFileCallback)); global->Set(context, v8_str("external"), external); } 

6.3 工程评价

优点缺点
实现简单非标准
灵活安全边界模糊
兼容历史难以维护

📌 结论:

window.external 是“能用但不该再扩展”的方案


七、方式四:Chrome WebUI(官方推荐方案)

7.1 JS 侧

chrome.send('readFile', ['path']); 

7.2 C++ 侧

web_ui()->RegisterMessageCallback( "readFile", base::BindRepeating(&Handler::ReadFile, base::Unretained(this))); 

7.3 回调 JS

ResolveJavascriptCallback(callback_id, base::Value(result)); 

7.4 特点

  • Chrome 内置页面广泛使用

  • 权限模型清晰

  • 生命周期受控

📌 结论:

WebUI 是 Chromium 当前阶段最稳妥的 JS ↔ C++ 通信方案


八、方式五:Mojo WebUI(未来方向)

8.1 Mojo IDL

module browser.mojom; interface FileService { ReadFile(string path) => (string content); }; 

8.2 C++ 实现

class FileServiceImpl : public mojom::FileService { public: void ReadFile(const std::string& path, ReadFileCallback callback) override; }; 

8.3 JS 调用

import {FileService} from './file_service.mojom-webui.js'; const service = FileService.getRemote(); const {content} = await service.readFile(path); 

8.4 为什么 Mojo 是未来

  • 强类型接口

  • 自动生成 JS / C++

  • IPC 原生支持

  • 安全性和可维护性极高

📌 结论:

Mojo WebUI 是 Chromium 官方长期演进方向


九、方式六:postMessage(间接通信)

9.1 示例

window.postMessage({ type: 'CMD' }, '*'); 

9.2 关键事实

❌ postMessage 永远不会直接进入 C++

真实路径是:

JS → JS →(WebUI / Extension)→ C++ 

📌 结论:

postMessage 是 JS ↔ JS 的工具
不是 JS ↔ C++ 的解决方案


十、方式七:WebView / CEF 宿主桥

10.1 JS

window.chrome.webview.postMessage({ cmd: 'readFile' }); 

10.2 C++(宿主)

webview->add_WebMessageReceived(...); 

10.3 架构定位

  • 属于宿主应用

  • 不属于 Chromium 浏览器自身

  • 不走 Browser / Renderer 模型

📌 结论:

WebView / CEF 是“浏览器被嵌入”时的方案
不是浏览器内核的通信主线


十一、7 种方式工程对比总结

方式官方安全可维护推荐度
Web API是高高低
Extension API是高中中
window.external否低低不推荐
WebUI是高高推荐
Mojo WebUI是极高极高强烈推荐
postMessage是中中不适合
WebView Bridge否中中不适合

十二、给定制浏览器的最终建议

结合 Chrome 132 / 360 浏览器等场景:

  • 历史能力:window.external(只维护,不新增)

  • 现有内置页面:WebUI

  • 所有新能力:Mojo WebUI

这是安全、可维护、符合 Chromium 演进方向的最优解。


十三、结语

JS ↔ C++ 通信方式的演进,本质上是:

浏览器从“功能堆砌”走向“系统级平台”的过程

理解这些通信机制,不只是为了“把功能跑通”,
而是为了写出能长期维护、能持续演进的内核代码。

ADS交叉耦合振荡器VCO相位噪声优化仿真实践 本文详细介绍了在ADS软件中搭建和优化交叉耦合VCO相位噪声的完整仿真实践。通过谐波平衡与瞬态仿真分析电路性能,并重点阐述了通过提升谐振腔Q值、优化晶体管工作点及改善尾电流源来有效降低相位噪声的具体方法,为射频电路设计提供了实用指南。 阅读详情

相关推荐

我的AI学习 ai维护工具之langfuse

as_type: Optional[Literal[‘generation’]] = None, # 将记录定义为 Observation (LLM 调用)transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string。要用LangFuse的云服务,首先要在LangFuse官网上注册,注册完后将页面拉倒最后,点免费的SignUp,API文档:https://api.reference.langfuse.com/

liubaobin的博客 4094

chromium 40 Mojo JavaScript 绑定 API

Mojo JavaScript 绑定 API 官网说明: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/mojo/public/js/README.md src\services\test\echo 有一个echo_service demo。可以结合使用。 注意编译生成 mojom 的 js 接口文件的命令 ninja -C out\Debug services\test\echo\public\mojom:mojom_j

一朵花开的时间 1130

H2O到OmniH2O细节解读,人形机器人遥操作的技术演进与哲学

摘要:CMU何泰然团队相继发表的H2O和OmniH2O论文为人形机器人遥操作领域带来突破。H2O首创Sim-to-Data方法,通过形态/动作重定向和特权筛选处理人类动作数据,PPO算法实现基础控制。OmniH2O改进为教师-学生蒸馏框架,采用DAgger算法增强泛化能力,并消除对线速度输入的依赖。这两项工作从概念验证到工程落地,建立了一套完整的动作学习范式,为具身智能研究提供了重要参考。

CyanNoah的博客 1387

chromium 入门

这么多年上班,自己都没有好好总结,这次休长假,好好进行整理整理,太零碎,每次有面试官问起,描述完工作经历,自己就觉得是一直在打杂。对自己的规划是,接下来5年内还是往浏览器内核方向发展,将自己以前所学的串一串,结合代码一起看看。先整理chromium 内核的入门。 接下来的文章会围绕如下几个点进行更新: (1)chrome apk的启动,做了哪了什么启动了哪些县城,跟webview有什么关系; (2)chrome从输入URL到页面展示,这中间发生了什么,这包含了网络模块...

木希博客 1101

CanOpen PDO映射实战:从原理到配置的完整指南

本文详细解析了CanOpen PDO映射的原理与配置流程,从基础通信机制到实战配置步骤,涵盖禁用PDO、清空映射、逐项映射和使能PDO等关键环节。特别针对西门子G120变频器、台达伺服和倍福CX控制器等不同厂商设备,提供了具体的配置技巧和常见问题排查指南,帮助工程师快速掌握多厂商设备间的PDO通信配置。

weixin_30718391的博客 515

红外小目标检测新思路:当DETR遇上Mamba状态空间模型,速度提升3倍

本文探讨了将Mamba状态空间模型与DETR框架结合,用于解决红外小目标检测的难题。该创新方案通过线性复杂度的Mamba模块替代传统Transformer的自注意力机制,在保持高检测精度的同时,显著提升了推理速度,实现了实时性能的突破,为无人机巡检、安防监控等场景提供了高效解决方案。

hhh00的博客 664

chromium mojo 快速入门

术语: 消息管道:是一组端点. 每个endpoint有一个接受消息的队列, 在一个端点上写消息会高效地放入对端端点的消息队列上。所以消息管道是双工通信的。 mojom文件:描述了接口,它们描述了类似proto files的强类型消息结构,通过binding generator可以产生对应于不同语言的文件。 给定一个mojom interface和一条message pipe, 它的两个端点可...

tornmy的博客 1万+

携程景点评论数据爬取实战:破解AJAX动态加载与分页参数逆向分析

本文详细介绍了携程景点评论数据爬取的实战经验,重点破解了AJAX动态加载与分页参数逆向分析的技术难题。通过分析`getCommentCollapseList`接口,解析动态参数如`poiId`和`pageIndex`,并实现分页逻辑,帮助开发者高效获取评论数据。文章还提供了完整的Python爬虫代码和反爬策略,适用于数据分析与内容挖掘。

weixin_29098367的博客 673

CEF、Electron、Tauri桌面开发硬边界深度对比

桌面应用开发中,Web技术栈与操作系统内核的交互本质是跨执行环境的系统集成问题。其核心原理在于:浏览器渲染引擎(Chromium/WebView2)与本地系统能力(硬件驱动、API调用、权限模型)之间存在天然隔离层。技术价值体现在对内存控制、ABI兼容性、进程通信安全性的差异化取舍——CEF提供源码级定制能力但需承担编译与维护成本;Electron以Node.js为胶水实现快速交付,却面临IPC可靠性与沙箱限制;Tauri通过Rust重定义信任边界,牺牲生态成熟度换取资源效率。典型应用场景包括ARM64视频

weixin_34166847的博客 235

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 338

“双系统”出炉!瑞芯微RK3562J非对称AMP:Linux+RTOS/裸机

执行如下命令运行Linux应用程序rpmsg_echo,发送8个rpmsg数据包至运行Baremetal程序的Cortex-M0核心,当Cortex-M0核心每收到1个rpmsg数据包就会将数据包发送回Linux端。开发者可灵活分配任务或指定核心间通信,从而增强系统稳定性,减少崩溃风险,保障数据完整。下文以Cortex-A53(CPU0、CPU1、CPU2、CPU3)核心运行Linux系统与rpmsg_echo应用程序,Cortex-M0(MCU)核心运行Baremetal程序为例进行演示。

创龙,嵌入式一体化解决方案商 467

GPU 编程 DSL 全景对比:TileLang、Triton、Mojo、cuTile、CuTe、ThunderKittens 与 CuTe DSL

GPU 编程 DSL 的百花齐放,本质是"性能"与"生产力"这对矛盾的持续博弈。从 CUTLASS 的模板工程,到 Triton 的 Python 抽象,再到 CuTe 的布局理论、Mojo 的语言重造,每一代方案都在试图把"手写 CUDA 的痛苦"再降低一点,同时不丢掉硬件性能。理解它们的时间线与相互关系,比记住每个 API 更重要——因为下一个方案,很可能就是这些思想的又一次重组。

Maxwell_Newton的博客 342

Imagiq AI-PQ 图像质量增强模块详解:联发科 ISP 中的 AI 图像管线实战解析

随着智能手机影像系统对图像质量要求的持续提升,联发科在其 Imagiq ISP 中引入了 AI 驱动的图像增强模块——AI-PQ(AI-based Picture Quality),通过 AI 模型对亮度、色彩、噪声、锐度等多个维度进行动态调节与增强,实现更加智能化和个性化的图像输出效果。AI-PQ 在实际工程中已成为影响照片风格、视频观感和多模组一致性的核心能力之一。本文围绕 Imagiq 平台最新一代 AI-PQ 模块(2024-2025年量产平台为基础),结合实机开发与调优经验,深入剖析其各子模块的算

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1417

Mojo 深度解析:从 Python 语法到系统级性能,一门 DSL 的前世今生与未来

Mojo 的出现,本质上是对"两语言问题"的一次正面回应。它继承了 Python 的语法亲和力、Swift 的渐进式类型思想、Rust 的所有权模型、MLIR 的编译基础设施,试图用一门语言覆盖从原型到生产的全链路。它目前还不是银弹:生态年轻、工具链在演进、GPU 内核的表达力仍需验证。但它的设计方向是清晰的——让性能不再是易用性的对立面。对于 AI 工程师来说,现在是用 Mojo 写一些实验性内核、观察其演进的好时机;

Maxwell_Newton的博客 273

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Chrome 扩展安全攻防实录:从攻击面到防御实践

本文系统剖析Chrome扩展安全风险,涵盖其架构组成、权限模型与通信机制,梳理权限滥用、脚本注入、消息信任漏洞等攻击面,结合XSS提权、伪造消息、供应链攻击等典型案例,提出最小权限、输入校验、CSP策略、依赖管理等防御体系,并提供静态检查、动态调试等审计实践。展望Manifest V3下安全演进方向,为开发者与安全研究者提供全面防护指南。

2401_84466325的博客 182

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Chrome 诡异问题|地址栏输入[baidu.com](https://baidu.com),页面却显示 Google 主页,无痕模式、设置页空白故障解决

今天遇到一个很奇怪的 Chrome 故障:地址栏明明输入baidu.com,打开页面却是 Google 首页,chrome://settings设置页面空白,无痕窗口访问百度同样黑屏,最终通过管理员 PowerShell 执行ipconfig /flushdns、netsh winsock reset并重启电脑修复。

m0_74451345的博客 99

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【AI工具集】搭建Chrome Use替换Trae/CodeBuddy的Browser Use/浏览器控制/agent-browser

# 【AI工具集】搭建Chrome Use支持小龙虾/Trae/CodeBuddy的Browser Use/浏览器控制/agent-browser替换 ## 结论先行 **目的:** 在 Chrome 浏览器安装 chrome-use 扩展插件,打通浏览器和agent工具的桥联。可以用在openclaw 小龙虾,Trae , CodeBuddy(Work版本一样),稳定 & 深度 控制页面元素级内容,不受后台 / 浏览器缩放 / 桌面分辨率变化影响 / 兼容本地和云端LLM模型 ## 背景 最近在做AI自

刻痕 206

Chrome 扩展安全攻防实录:从权限滥用到供应链投毒

汇总开发者自查清单与使用者风险识别要点,给出可执行的落地建议。

FJ39SfgYS的博客 205

墨墨助记 Moji v0.3.0 升级|Chrome 网页离线查词,收藏生词也能留下原句

墨墨助记 Moji v0.3.0 为桌面 Chrome 带来网页离线查词:双击生词或划选短语,点一下放大镜,就能在原文旁看释义、助记和例句。连接墨墨后,可把生词、网页原句和中文译文一起收藏,还能分别设置参与高亮的复习词本和新词的收藏去向。文中用 abandon 演示完整流程。

长路漫漫的歇脚处 219

Chrome 内存泄漏诊断指南:从现象到根因的完整排查路径

诊断流程回顾:现象 → 基线 → 趋势 → 快照 → 引用链 → 修复 → 验证工具选择建议与学习资源。

qq_44304677的博客 290

Chrome 内存泄漏诊断指南:从现象定位到根因排查

本文系统解析前端内存泄漏的成因、诊断与预防,涵盖堆栈内存模型、V8垃圾回收机制及常见泄漏场景(如未解绑事件、定时器、闭包滥用等)。通过Chrome DevTools性能面板、堆快照对比、分配时间线等工具,结合“五步定位法”实战排查,剖析路由切换、虚拟列表、WebSocket缓存等典型案例。强调编码规范、生命周期管理与工程化监控,提出“先确认、再定位、后验证”的方法论,助力开发者提升应用稳定性与性能。

2401_84488651的博客 304

Chrome内存占用过高:2026年完整优化指南

Chrome 开几个标签页内存就飙到90%以上,风扇狂转、系统卡顿?本文从标签管理、进程策略、内存回收、后台限制到实验性开关,一步步教你把 Chrome 内存占用压下来,多开页面也能保持流畅。

the3clipse的博客 309
上一篇: 深入探索 Chrome 中渲染进程与浏览器进程之间的 Mojo IPC 通信机制
下一篇: 为什么浏览器厂商坚决不让 Web JS 变成 Node.js?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值