You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook中underscore.js无法访问的问题排查求助

问题分析与解决方案

核心结论

这不是ipywidgets 7.7.3版本的预期变更——7.x系列始终依赖underscore,官方没有移除全局_的计划。问题出在新机器的环境加载策略或自定义组件的依赖写法上。

可能的原因

  • 新机器的Jupyter Notebook前端版本与旧机器不同:部分Notebook版本调整了依赖加载逻辑,不再自动将underscore暴露为全局变量_,仅保留AMD模块形式。而旧机器的版本会自动把underscore挂到window._上。
  • 自定义组件依赖全局变量而非规范引入:你的组件代码直接使用全局_,但新环境中underscore仅通过require加载,未注入全局作用域。
  • 加载顺序差异:旧机器中某个基础widget提前加载了underscore并触发全局暴露,新机器的组件加载顺序变化,导致你的自定义组件执行时underscore还没被加载到全局。

解决办法

1. 规范自定义组件的依赖引入(推荐)

修改组件的JS代码,用AMD规范显式引入underscore,不再依赖全局变量:

// 组件定义时声明依赖
define(['underscore', 'jupyter-js-widgets'], function(_, widgets) {
    // 这里编写你的组件逻辑,直接使用传入的_变量
    var MyWidget = widgets.DOMWidgetView.extend({
        render: function() {
            // 示例:使用underscore的each方法
            _.each(this.model.get('items'), function(item) {
                // 处理逻辑
            });
        }
    });
    return {
        MyWidget: MyWidget
    };
});

2. 临时全局注入(快速验证用)

在Notebook的初始化单元格中执行以下代码,手动将underscore挂到全局:

%%js
require(['underscore'], function(_) {
    window._ = _;
});

执行后再运行你的自定义组件,应该能解决_ is not defined的问题。

3. 对齐环境版本

对比新旧机器的Jupyter Notebook版本(执行jupyter notebook --version),如果版本差异较大,可将新机器的Notebook版本降级到与旧机器一致,验证是否恢复全局_的自动暴露。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:31:01