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

将main.js设为模块后,导入的JS变量在HTML中显示未定义的问题

模块导入后变量未定义的问题分析与解决

问题现象

通过export.js导出MainNumber变量,在main.js中导入后以模块方式引入HTML,页面内的脚本打印该变量时会报错Uncaught ReferenceError: MainNumber is not defined;但如果不用模块模式,直接在main.js定义变量,页面脚本就能正常输出128。使用VSCode的Live Server运行代码。

问题原因

ES模块(即带type="module"的脚本)拥有独立的模块作用域,模块内的变量、函数默认不会挂载到全局window对象上。而普通脚本(不带type="module")的变量默认属于全局作用域,页面内其他脚本可以直接访问。

你之前的模块模式中,MainNumber只存在于main.js的模块作用域里,页面内的普通脚本无法跨作用域访问这个变量,所以报错。

解决方法

方法1:将变量挂载到全局对象

修改main.js,把导入的变量挂载到window上,让全局作用域能访问:

import { MainNumber } from "./export.js";
window.MainNumber = MainNumber;

这样页面内的脚本就能正常打印MainNumber了。

方法2:让页面脚本也作为模块

把页面内的脚本标记为模块,直接导入变量使用:
修改index.html的脚本部分:

<script type="module">
    import { MainNumber } from "./export.js";
    console.log(MainNumber);
</script>

这种方式更符合ES模块的规范,避免污染全局作用域。

方法3:在模块内直接执行打印逻辑

直接在main.js里完成打印操作,不需要页面脚本单独访问:

import { MainNumber } from "./export.js";
console.log(MainNumber);

这样HTML里只需要引入模块脚本即可,无需额外的打印脚本。

修正后的代码示例

方法1的完整代码

export.js:

export let MainNumber = 128;

main.js:

import { MainNumber } from "./export.js";
window.MainNumber = MainNumber;

index.html:

<!DOCTYPE html>
<html lang="en">
    <head>
        <script type="module" src="main.js"></script>
    </head>
    <body>
        <script>
            console.log(MainNumber);
        </script>
    </body>
</html>

方法2的完整代码

export.js:

export let MainNumber = 128;

index.html:

<!DOCTYPE html>
<html lang="en">
    <head>
    </head>
    <body>
        <script type="module">
            import { MainNumber } from "./export.js";
            console.log(MainNumber);
        </script>
    </body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:20:14