我正在研究单页架构(SPA)Web应用程序。我已经实现了动态加载应用程序的不同页面的功能。
这是我的 spa.js 看起来像
var spa = {
init: async () => {
await import('./page.js')
spa.data['page'].apply()
},
register: (page, data) => {
spa.data[page] = data
},
data: {},
}
window.onload = () => {
spa.init()
}
而这是我的 page.js 看起来像
const pageData = {
apply: () => {
document.body.innerHTML = getMSG()
}
}
function getMSG() {
return "hello message!"
}
spa.register('page', pageData)
工作过程解释。
这很好用。但有一件奇怪的事!
这个... 应用() 方法可以访问裸露的 getMSG()但当我尝试执行 getMSG() 通过浏览器的开发控制台,我得到了ReferenceError,暗示着 getMSG() 是完全没有定义的! 我们的 页面数据
下面是托管的heroku应用,你可以试试--。代客进口
虽然它非常好,因为我不用担心不同文件中的函数冲突,但我想知道这是怎么回事。
谁能解释一下,我怎样才能访问定义在 page.js. 我知道导出,但它是以某种方式可以不导出!我正在做单页架构(SPA)Web应用程序。
如果模块中定义的函数和变量没有被导出,你就不能直接访问它们。
原因是 spa
变量在全球范围内都可以访问,是因为 spa.js
是正常的文字,在HTML文档头部引用。
<head>
...
<script src="./spa.js"></script>
</head>
另一方面,如果你,。import
脚本,变量在不同的范围内,除非你导出它们。所以 page.js
被视为一个模块.
当然,你也可以将函数 getMSG()
对全球的影响 spa
可变 pageData
但两者都是变通的办法。
spa.getMSG = getMSG;
你可以在这里阅读更多关于模块和标准脚本之间的区别--。MDN JavaScript模块.