视图引用已编译JS文件仍报simpleFc函数未定义错误
报错根因
源文件使用ES Module规范的export语法导出函数时,函数作用域被限制在模块内部,不会自动挂载到全局window对象,普通内联脚本无法直接访问模块内部的变量,因此触发simpleFc is not defined报错。
项目构建无报错、浏览器无其他JS错误、产物内容正确,是因为模块语法本身合法,只是作用域规则导致全局访问失败。
可用解决方案
- 方案1:按ES模块规范引入并调用
给外部脚本标签添加type="module"属性标记为模块,内联调用的脚本也需要声明为模块,通过import语法导入函数后再调用:<!-- 引入模块脚本 --> <script type="module" src="~/dist/js/testFile.build.js"></script> <!-- 模块内调用函数 --> <script type="module"> import { simpleFc } from '~/dist/js/testFile.build.js'; simpleFc('show alert'); </script> - 方案2:手动将函数挂载到全局作用域
如果不想调整脚本引入方式,直接在源文件里把需要全局调用的函数挂载到window对象即可,原有引入和调用代码无需修改:export const simpleFc = (input) => { alert(input); } // 挂载到全局 window.simpleFc = simpleFc; - 方案3:调整构建配置输出全局可用的产物
修改构建工具(Rollup/Vite/Webpack等)的输出配置,将产物格式设置为iife或umd,指定全局导出名,构建后的产物会自动把导出内容挂载到全局对象,无需手动修改源码。
提示:普通脚本(未声明
type="module"的script标签)和ES模块有独立的作用域隔离,这是JavaScript语言标准的设计,不属于路径引入错误或构建错误。
内容的提问来源于stack exchange,提问作者nickornotto
相关产品推荐
相关产品推荐

