我正在接管V2 Docusaurus的网站。
我们网站的一个特殊之处是我们需要加载office.js和css-vars-ponyfill.min.js,并在一开始就进行一些操作。所以之前的开发者决定使用下面的方法。
在每一.mdx.md
页中,他都用一个组件包装了内容MainWrapper
:
<MainWrapper>
... ...
Real content
... ...
</MainWrapper>
MainWrapper/index.js
定义如下
function MainWrapper(props) {
return (<>
<Head>
<script defer
src="https://www.10studio.tech/lib/patches.js"
onload="(function(){console.log('patches.js fully loaded MainWrapper')}).call(this)" >
</script>
</Head>
<CssvarsWrapper></CssvarsWrapper>
<OfficejsWrapper></OfficejsWrapper>
{props.children}
</>)
}
export default MainWrapper;
CssvarsWrapper/index.js
定义如下
function CssvarsWrapper(props) {
return (<>
<Head>
<script defer
src="https://www.10studio.tech/lib/patches.js"
onload="(function(){console.log('patches.js fully loaded in CssvarsWrapper')}).call(this)">
</script>
{console.log("CssvarsWrapper > index.js > CssvarsWrapper")}
<script defer
src="https://unpkg.com/css-vars-ponyfill@2/dist/css-vars-ponyfill.min.js"
onload="(function(){console.log('css-vars-ponyfill.min.js fully loaded in CssvarsWrapper'); onCssVarsPonyfillLoad()}).call(this) ">
</script>
</Head>
{props.children}
</>)
}
OfficejsWrapper/index.js
定义如下
function OfficeWrapper(props) {
return (
<>
<Head>
<script defer
src="https://www.10studio.tech/lib/patches.js"
onload="(function(){console.log('patches.js fully loaded in OfficeWrapper')}).call(this)">
</script>
{console.log("OfficejsWrapper > index.js > OfficeWrapper")}
<script defer
src='https://appsforoffice.microsoft.com/lib/1/hosted/office.js'
onload="(function(){console.log('office.js fully loaded in OfficeWrapper'); onOfficejsLoad()}).call(this) ">
</script>
</Head>
{props.children}
</>
)
}
lib/Patches.js
包含实际操作:
console.log("in patches")
... ...
function onCssVarsPonyfillLoad() {
console.log("patches.js > onCssVarsPonyfillLoad()")
cssVars({
onlyLegacy: false,
onComplete: function (cssText, styleElms, cssVariables, benchmark) {
}
});
}
function onOfficejsLoad() {
Office.onReady(function () {
console.log("office.js is ready.");
patch();
})
}
但是,我的测试表明,无论defer
标签如何,此实现都不能始终遵守正确的文件加载顺序。例如,如下面的屏幕截图所示,css-vars-ponyfill.min.js fully loaded in CssvarsWrapper
并且office.js fully loaded in OfficeWrapper
是 before patches.js fully loaded
,因此onCssVarsPonyfillLoad
在onOfficejsLoad
调用它们时还没有准备好。
实际上,我们应该确保patches.js
总是在css-vars-ponyfill.min.js
和office.js
之前加载。有谁知道如何确保这一点?
此外,这种方法(即,围绕每个页面的内容包装一个组件以在上游进行一些操作)是否正确?