【发布时间】:2020-05-19 13:19:24
【问题描述】:
我正在开发单页架构 (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)
工作流程说明:
- 最初会加载 spa.js。 spa.data 为空
- 它启动 spa.init(),它会加载 page.js
- page.js 将其数据注册到 spa 变量
- 现在控制跳回到 spa.js 和 spa.data 页面,它将执行 apply()
这很好用。但这里有一件奇怪的事情!
apply() 方法可以访问裸 getMSG(),但是当我尝试通过浏览器的开发人员执行 getMSG()控制台我得到 ReferenceError 暗示 getMSG() 根本没有定义!我们的 pageData
也是如此这里是托管的heroku应用,你可以试试-dyn-import
虽然它非常好,因为我不必担心不同文件中的函数冲突,但我想知道这是怎么发生的。
谁能解释我如何访问 page.js 中定义的方法和变量。我知道出口,但不知何故没有出口!
【问题讨论】:
-
用控制台执行是什么意思?您希望它可以在全球范围内访问吗?
-
await import('./page.js').then()很奇怪。要么你await something(),要么你用something().then()去承诺风格。但不是两者都 -
@ThakurKarthik 控制台,我的意思是浏览器控制台(F12,开发者控制台)。当我尝试通过控制台访问该方法时,它显示未定义。但是脚本可以访问它,就好像它是全局的一样。我的问题是它是全球性的吗?如果是,为什么它在控制台中不起作用,如果不是,如何应用方法访问它?
标签: javascript single-page-application dynamic-import