Я захватил веб-сайт 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
были до patches.js fully loaded
, в результате onCssVarsPonyfillLoad
и onOfficejsLoad
не были готовы, когда их вызывали.
На самом деле, мы должны убедитесь, что patches.js
всегда загружается до css-vars-ponyfill.min.js
и office.js
. Кто-нибудь знает, как обеспечить это?
Кроме того, правильный ли этот подход (т. Е. Обертывание компонента вокруг содержимого каждой страницы для выполнения некоторых операций в восходящем направлении)?