fix: only load preset when needed

pull/38240/head
Oliver Eyton-Williams 2020-01-16 11:27:26 +01:00 committed by mrugesh
parent 21833ab508
commit d87c16e65e
1 changed files with 30 additions and 10 deletions

View File

@ -47,12 +47,6 @@ async function loadBabel() {
Babel = await import(
/* webpackChunkName: "@babel/standalone" */ '@babel/standalone'
);
presetEnv = await import(
/* webpackChunkName: "@babel/preset-env" */ '@babel/preset-env'
);
presetReact = await import(
/* webpackChunkName: "@babel/preset-react" */ '@babel/preset-react'
);
/* eslint-enable no-inline-comments */
Babel.registerPlugin(
'loopProtection',
@ -62,13 +56,19 @@ async function loadBabel() {
'testLoopProtection',
protect(testProtectTimeout, testLoopProtectCB, loopsPerTimeoutCheck)
);
}
async function loadPresetEnv() {
if (presetEnv) return;
/* eslint-disable no-inline-comments */
presetEnv = await import(
/* webpackChunkName: "@babel/preset-env" */ '@babel/preset-env'
);
/* eslint-enable no-inline-comments */
babelOptionsJSBase = {
presets: [presetEnv]
};
babelOptionsJSX = {
plugins: ['loopProtection'],
presets: [presetEnv, presetReact]
};
babelOptionsJS = {
...babelOptionsJSBase,
plugins: ['testLoopProtection']
@ -79,6 +79,23 @@ async function loadBabel() {
};
}
async function loadPresetReact() {
if (presetReact) return;
/* eslint-disable no-inline-comments */
presetReact = await import(
/* webpackChunkName: "@babel/preset-react" */ '@babel/preset-react'
);
if (!presetEnv)
presetEnv = await import(
/* webpackChunkName: "@babel/preset-env" */ '@babel/preset-env'
);
/* eslint-enable no-inline-comments */
babelOptionsJSX = {
plugins: ['loopProtection'],
presets: [presetEnv, presetReact]
};
}
const babelTransformCode = options => code =>
Babel.transform(code, options).code;
@ -128,6 +145,7 @@ const babelTransformer = ({ preview = false, protect = true }) => {
testJS,
async code => {
await loadBabel();
await loadPresetEnv();
return partial(
vinyl.transformHeadTailAndContents,
tryTransform(babelTransformCode(options))
@ -138,6 +156,7 @@ const babelTransformer = ({ preview = false, protect = true }) => {
testJSX,
async code => {
await loadBabel();
await loadPresetReact();
return flow(
partial(
vinyl.transformHeadTailAndContents,
@ -164,6 +183,7 @@ async function transformSASS(element) {
async function transformScript(element) {
await loadBabel();
await loadPresetReact();
const scriptTags = element.querySelectorAll('script');
scriptTags.forEach(script => {
script.innerHTML = tryTransform(babelTransformCode(babelOptionsJSX))(