Becomin' Charles

算法 | LNMP | Flutter | Mac

Becomin' Charles

为了提升网站性能,或者为了更好的模块化开发,我们可能用 AJAX 技术,载入部分页面内容(HTML),里面也可能包含新的 JS 逻辑代码或者外部 JS 文件。

为了讨论方便,我在这里把一个普通的网页称为 “主页面” 或者 “父页面”,用以区分 AJAX 加载的部分,那部分我称为 “子页面”。

Vue 对象不存在的问题

我们遇到了这样一个问题,父页面里,有一个弹窗,是通过 AJAX 加载的,弹窗里用了 Vue 的对象,所以弹窗里也引用了 Vue.js 的库。

此前,这个功能一直运转正常,但是,当我们引入 CDN 给全局的静态文件加速后,突然开始报错,Vue 对象不存在。就是在 AJAX 引入的子页面里,当初始化 Vue 的时候,报错 Vue 对象不存在。显示是 Vue.js 文件还没有下载并初始化完毕。

那么,为什么没使用 CDN 的时候,反倒是每次都可以等到 Vue.js 下载完毕再调用呢?使用了 CDN 反倒不可以?

问题分析

先来看一个 “子页面” 里的代码片段:

1
2
3
$(document).ready(function() {
const app = Vue.createApp(Main);
})

这个代码片段,在 “子页面” 里使用了 jQuery 的 document 对象的 ready 事件,那么 jQuery 是哪里来的呢?是 “父页面” 里本来就有的,所以在子页面里可以直接引用。但是这个 ready 事件为什么在 Vue 对象加载完毕之前就触发了呢?

可以认为,ready 事件在 AJAX 加载的内容和在父页面里,定义是不一样的。网上我也搜到了一些记录,就是讲,AJAX 加载的内容里,ready 会在加载的瞬间就会触发,所以,我怀疑,这个 ready 是父页面的 DOM 加载完毕后,就始终处于 ready 状态了。

所以,这么做大概率是不对的。但是这里有个问题,为什么使用 CDN 之前,这么做没问题呢?

碰巧对了。

我猜测,现在都是使用 h2 协议来连接服务器了,所以在 AJAX 下载子页面的时候,里面的脚本也在同一台服务器,也都共享了同一个连接下载,所以,本质上,造成了一种同步下载的效果。

但是换了 CDN 后,共享同一个下载连接的情况就不存在了,浏览器的行为,回到了一种通用的情况。这种情况就是,对 <script> 引入的 JS 文件,浏览器采用异步的方式下载,并且,刚才也说了 document.ready 事件是无效的。

那么最早下载完毕的子页面内嵌代码,最先执行,后果就是 Vue 对象不存在。

解决办法

知道了原因,解决办法就很显然。

第一个方法,将 Vue 的引用安排到父页面。这样,子页面可以直接引用,届时,Vue 对象肯定是存在的。

第二个方法,显示动态加载 Vue.js 库,并在回调中调用逻辑代码,也是可以的,并且就不用假设浏览器的行为等问题。

1
2
3
4
5
6
7
8
9
10
['a.js', 'b.js'].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
document.head.appendChild(script);
script.onload = () => {
if (src == 'a.js') {
const app = Vue.createApp(Main);
}
}
});

上面的代码片段,展示了动态载入 JS 的方式,

总结

使用 AJAX 载入 HTML 的时候,外部 JS 文件和内嵌代码的执行顺序和时机,都是要小心处理,不然容易产生 Bug。

不过,以上都是我的推测,不能当真,只是基于经验的一种推测,还需要严谨地证明。不过我时间比较紧,记录在这里,后面有时间,我要写代码来验证一下,届时再和大家分享。

我在使用 Mac 的命令行管理自己的服务器的时候,我一直使用一个 goto 的命令,这个命令会列出所有的服务器列表,里面包含用户名,IP 地址,以及备注,我只要再键入一个序号,就可以自动发起对服务器的连接。这个脚本是我自己写的,是一个 Python 的命令行脚本。今年,这个脚本不能运行了,后来我打开 Cursor 寻求解决方法,AI 建议我将这个命令打包封装。

阅读全文 »

最近阅读完了《子弹笔记术》这本书,我觉得比起《麦肯锡笔记术》这种商业环境中使用的解决问题的笔记法,以及《康奈尔笔记法》这是学校里使用的提升学习效率的笔记法,子弹笔记术,本质上是帮助我们管理生活的,万用笔记法。

阅读全文 »

最近,感觉很苦恼,好久没有沉浸式工作过了。

哈佛幸福课里说,什么叫幸福呢?就是尽可能长时间在心流状态下工作,在心流状态下工作的时间越长,或者比例越高,人的整体幸福感就越高。

我觉得我已经很久没有在心流的状态下工作过了。

互联网,短视频,以及本身身处的管理岗位的工作模式,已经摧毁了我的耐心,注意力。大概就是,比如看一本小说,不能沉下心来去认真看,总是会分心,然后就中断了阅读,两个礼拜没有读完 100 页。如果沉下心来读书,就会觉得焦虑。

不能看内容比较深的电影,如果情节跌宕,感人肺腑,就没法沉下心来看,下意识就想关掉。但是那种爆米花,或者垃圾电影,没什么深刻的戏剧冲突的,浮躁的东西,反倒可以看完。

听小说也是,只想听那种垃圾快餐文,升级,打怪,装逼,如果有情节,有深度,感人的东西,无法看进去。

做事情就更明显了,如果沉下心来写代码,完成一个小功能,无法投入进去。更多做策略性,规划性的东西,就是很容易被批评的那种,画大饼,指点江山的工作。如果脚踏实地去写,一个个功能去完成,一行行代码去堆砌,就无法胜任。

我感觉这是一种病,不知道怎么了,可能需要去看看了。我总是在焦虑、急躁,进而痛苦,憎恨自己。然后是担忧、害怕,无法找到自己的价值和意义。

最近,真的很焦虑。

大语言模型的火爆,已经渐渐形成了一个洪流,显然不像是 AlphaGo 出现的时候那样,短暂出圈一下,就渐渐远离了日常生活。那个时候,还停留在特定应用的层面,没有形成什么足以撼动底层生活的杀手级应用。

阅读全文 »

最近,读了《麦肯锡笔记术》。介绍了麦肯锡管理顾问的一种工作方法:笔记术,他们是如何通过笔记进行思考,从而解决问题的。

阅读全文 »

上周,冯少说要来香港,公司给他办理的高才通计划,他来激活签证,申领身份证,顺便在香港玩玩。不过香港着实没什么好玩的,因为香港很小,很容易就转遍了,但是如果你走马观花看一圈,也不会有什么很深的印象。

阅读全文 »

我已经不知道有多少年没有写过年度总结了,这些年都是奔波且动荡的,在这种不稳定中,有一些间歇性平衡的生活,动荡是主旋律,而规律只是暂时的。

2018 年,为了追求更好的工作机会,以及去外面看看,老婆申请了北京的工作机会,成为一个北漂,到 2019 年,女儿随着她也去到北京,我一个人在上海工作,过上了两地奔波的双城生活。平均每两周去一次北京,我积累了厚厚的一沓飞机火车票。

阅读全文 »