Wil*_*llD 2 javascript internet-explorer babeljs template-literals vite
尝试在库模式下使用 Vite 将 ES6.js文件编译为将在 Internet Explorer 11 中运行的捆绑 ES5.js文件。在我的实际应用程序中,有几个文件使用 ESM 导入/导出,但是我已经验证我可以重现单个简化示例文件的问题。我将在下面介绍。
这是我的配置:
//vite.config.js
const path = require('path');
const { defineConfig } = require('vite');
import { babel } from '@rollup/plugin-babel';
module.exports = defineConfig({
esbuild: false,
plugins: [
babel({
babelHelpers: 'bundled',
presets: [['@babel/preset-env', { targets: { browsers: 'defaults, ie >= 11' } }]],
}),
],
build: {
outDir: 'javascript',
lib: {
entry: path.resolve(__dirname, 'js-src/index.js'),
name: 'MyLib',
fileName: (format) => 'my-lib.js',
},
},
});
Run Code Online (Sandbox Code Playgroud)
测试文件:
const aWord = 'World';
const multiLineString = `
Hello ${aWord}
`;
console.log(multiLineString);
Run Code Online (Sandbox Code Playgroud)
结果输出文件:
(function(n){typeof define=="function"&&define.amd?define(n):n()})(function(){"use strict";var n=`
Hello `.concat(aWord,`
`);console.log(n)});
Run Code Online (Sandbox Code Playgroud)
请注意转译后的代码如何下移到 ES5(请参阅var而不是const),但它不会删除模板文字反引号并将其转换为对 Internet Explorer 11 安全的其他类型的字符串。它仅发生在多行模板上不过文字字符串。单行模板文字将更改为带有"字符的字符串。
寻找一种解决方案来强制 babel 删除这些反引号字符并将它们转换为受支持的字符串类型(也保留换行符)
我找到了罪魁祸首。\n不是 Babel,而是 Esbuild。
\nBabel 在正确地转译所有内容方面做得很好之后(我检查过,确实如此),优化开始,并且 Esbuild(默认情况下)“优化”那些新到达的换行符“\\n”回到更精简的(字符方面)多行字符串。
\n我发现您尝试禁用 Esbuildesbuild = false但也许这不是“当时”(11 月 21 日)正确的配置选项,以阻止 Esbuild 弄乱您的结果。
为了阻止 Esbuild 将带有换行符的字符串重新编译回多行字符串,您有两个选择
\nbuild.minify = falsebuild.target = \'ie11\'一旦build.target设置为ie11构建过程,就会开始抱怨 Esbuild 尚未准备好将代码的相当一部分转换为 IE11 规范。我认为这是因为 Esbuild 在插件运行之前运行,然后再次运行以进行最终优化。
所以使用@vite/babel不再是一种选择,新的 Babel 方式通过@rollup/plugin-babel.
以下是我的工作vite.config.js,或者至少是其中的重要部分:
// vite.config.js\nimport { defineConfig } from \'vite\'\nimport { getBabelOutputPlugin } from \'@rollup/plugin-babel\'\n\nexport default defineConfig({\n build: {\n target: \'ie11\',\n lib: {\n /* your vite lib mode params */\n },\n rollupOptions: {\n // make sure to externalize deps that shouldn\'t be bundled\n // into your library\n external: [],\n output: {\n plugins: [\n /**\n * Running Babel on the generated code:\n * https://github.com/rollup/plugins/blob/master/packages/babel/README.md#running-babel-on-the-generated-code\n *\n * Transforming ES6+ syntax to ES5 is not supported yet, there are two ways to do:\n * https://github.com/evanw/esbuild/issues/1010#issuecomment-803865232\n * We choose to run Babel on the output files after esbuild.\n *\n * @vitejs/plugin-legacy does not support library mode:\n * https://github.com/vitejs/vite/issues/1639\n */\n getBabelOutputPlugin({\n allowAllFormats: true,\n presets: [\n [\n \'@babel/preset-env\',\n {\n targets: \'> 0.25%, not dead, IE 11\',\n useBuiltIns: false, // Default\xef\xbc\x9afalse\n // // https://babeljs.io/docs/en/babel-preset-env#modules\n modules: false\n },\n ]\n ]\n }),\n ]\n },\n plugins: [...]\n }\n }\n})\n\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4177 次 |
| 最近记录: |