Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

外链脚本没有按照引入的顺序执行 #424

Closed
achuan9 opened this issue Mar 2, 2023 · 11 comments
Closed

外链脚本没有按照引入的顺序执行 #424

achuan9 opened this issue Mar 2, 2023 · 11 comments
Labels
to do list to do list

Comments

@achuan9
Copy link

achuan9 commented Mar 2, 2023

描述bug
外链脚本没有按照引入的顺序执行,而是谁先加载完就执行谁

如何复现
给出详细的复现步骤
1、子应用通过外链形式引入vue.global.prod.min.js

2、主应用配置jsIgnores:

plugins: [{
    jsIgnores: [/vue\.global\.prod/]
}]

3、 打开控制台会提示Uncaught ReferenceError: Vue is not defined

最小复现仓库或者地址
这里精简了一下Wujie相关的代码来复现BUG:
https://stackblitz.com/edit/js-6myawr?file=index.html

@yiludege yiludege added the to do list to do list label Mar 2, 2023
@yiludege
Copy link
Collaborator

yiludege commented Mar 2, 2023

确实对于外联的脚本似乎没有串起来

@Newway1997
Copy link

应该是不支持这个vue.global.prod.min.js,这个js里直接是在全局作用域用的var声明变量Vue,被无界用function包裹后,var变量声明不会挂载到window上,类似于这样:

(function(){
    var Vue;
})()
console.log(Vue)//Uncaught ReferenceError: Vue is not defined

所以得用将全局变量挂载到window上或者umd格式的外联脚本

@achuan9
Copy link
Author

achuan9 commented Mar 6, 2023

应该是不支持这个vue.global.prod.min.js,这个js里直接是在全局作用域用的var声明变量Vue,被无界用function包裹后,var变量声明不会挂载到window上,类似于这样:

(function(){
    var Vue;
})()
console.log(Vue)//Uncaught ReferenceError: Vue is not defined

所以得用将全局变量挂载到window上或者umd格式的外联脚本

嗯嗯你说的这个也是日常开发需要注意的一个地方,但是我说的这个是动态添加iframe并新增外链脚本出现的问题

@Newway1997
Copy link

应该是不支持这个vue.global.prod.min.js,这个js里直接是在全局作用域用的var声明变量Vue,被无界用function包裹后,var变量声明不会挂载到window上,类似于这样:

(function(){
    var Vue;
})()
console.log(Vue)//Uncaught ReferenceError: Vue is not defined

所以得用将全局变量挂载到window上或者umd格式的外联脚本

嗯嗯你说的这个也是日常开发需要注意的一个地方,但是我说的这个是动态添加iframe并新增外链脚本出现的问题

就是这个vue.global.prod.min.js外链不行,执行顺序是对的,你把这个外链换成jquery的,在wujie中都是可以的。而且你这个精简的demo也不对,wujie是先获取外链js内容转为内联的script再append的,这个demo是直接append的外链script

@achuan9
Copy link
Author

achuan9 commented Mar 6, 2023

我这个demo就是说明不通过fetchappendhead中的情况,也就是配置jsIgnores的情况,为啥你说vue.global.prod.min.js外链不行?

@Newway1997
Copy link

哦,我理解你的意思了。我是指这个不配置jsIgnores也不行

@achuan9
Copy link
Author

achuan9 commented Mar 6, 2023

哦,我理解你的意思了。我是指这个不配置jsIgnores也不行

嗯嗯,你说的那个闭包的问题我知道的

@yyystation
Copy link

应该是不支持这个vue.global.prod.min.js,这个js里直接是在全局作用域用的var声明变量Vue,被无界用function包裹后,var变量声明不会挂载到window上,类似于这样:

(function(){
    var Vue;
})()
console.log(Vue)//Uncaught ReferenceError: Vue is not defined

所以得用将全局变量挂载到window上或者umd格式的外联脚本

请问,如果是镶嵌在html中的<script></script>代码块中的代码,当被wujie的function包住以后,如何才能被外部识别到

@achuan9
Copy link
Author

achuan9 commented Mar 8, 2023

@yyystation 配置jsLoader,例如:

jsLoader: (code, url, base) => {
    return code.replace("var Vue", "window.Vue");
}

@fychinesepjj
Copy link

fychinesepjj commented Mar 17, 2023

这个问题我也碰到了,加载的子应用中动态插入js,js的执行顺序很随机。
比如有个文件index.js 依赖window.antd,antd 资源包动态插入和执行应是在index.js之前的,但在wujie的容器中执行的时,就变成index.js先执行,并且情况很随机有时正常有时候不正常。
同时这个情况和资源包加载的时间也有很大关系,在wujie中是先加载完毕,先执行就导致了这个问题

@fychinesepjj
Copy link

@yiludege 请教这个问题现在有什么方案可以绕过去么

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
to do list to do list
Projects
None yet
Development

No branches or pull requests

5 participants