如何将 HTML 个文件作为模板导入 Rollup 并编译为连接字符串
How to import HTML files as templates into Rollup and compile to concatenated strings
我正在为使用 Rollup 的 Optimizely 实验创建一个构建过程。我们目前正在使用 Webpack,但它会为这个用例导出臃肿的代码。我希望能够将 .html 文件作为模板导入,并在我的 Rollup/Babel 构建中将它们编译为 ES5 兼容的串联字符串。
我已经在 https://github.com/rollup/awesome#templating 上尝试了一些模板插件,但不想添加另一个模块库作为每个实验的依赖项。我能够使用几个插件将 HTML 作为模板文字导入,但由于某些原因,它们无法通过 babel 编译为 ES5 兼容字符串。 Babel 似乎只将内联(未导入)模板文字编译为连接字符串。其他一切都能正确编译为 ES5。不确定为什么不包括外部 HTML 字符串。也许我的问题是 babel 配置?
我们在 Webpack 构建中使用的方法使用 html-es6-template-loader,它内置了编译功能,因此它可以开箱即用地生成 ES5 兼容的字符串连接。类似的东西可能是理想的。
这是我当前的配置。在这里使用 posthtml 但我尝试了多个插件,结果相同。
import babel from 'rollup-plugin-babel';
import posthtml from 'rollup-plugin-posthtml-template';
export default {
input: './src/index',
output: {
file: './dist/index.js',
format: 'cjs'
},
plugins: [
posthtml({
template: true
}),
babel({
exclude: 'node_modules/**',
presets: ['@babel/preset-env']
})
]
}
理想场景以HTML文件为模板,使用es6 ${}语法,导入JS文件,编译为内联字符串的JS文件。
template.html
<div class="some-div">hello ${data.entity}</div>
index.js用现代ES版本编写
import template from './template.html';
console.log(template({entity="world"})); // logs: <div class="some-div">hello world</div>
我希望结果是与 ES5 兼容的编译脚本,而不需要额外的模板代码。结果类似于下面的代码。
var template = function(data){
return '<div class="some-div">hello ' + data.entity + '</div>';
}
console.log(template({entity="world"})); // logs: <div class="some-div">hello world</div>
我想出了解决办法。我只需要将 HTML 添加到 babel 配置中。我之前不认为这是必需的,因为我认为 babel 在 HTML 被导入并转换为模板文字后才解析 JS 文件,但我想它是必需的。
我在浏览 docs on external dependencies for rollup-plugin-babel
时发现了这一点
babel({
exclude: 'node_modules/**',
presets: ['@babel/preset-env'],
extensions: ['.js', '.html']
})
如果您只想将 .html
文件作为字符串导入,那么您也可以尝试使用 rollup-plugin-html
:
// rollup.config.js
import html from "rollup-plugin-html";
export default {
input: "./index.js",
plugins: [
html({
include: "**/*.html",
}),
],
output: {
file: "my-module.js",
name: "MyModule",
format: "umd",
},
};
我正在为使用 Rollup 的 Optimizely 实验创建一个构建过程。我们目前正在使用 Webpack,但它会为这个用例导出臃肿的代码。我希望能够将 .html 文件作为模板导入,并在我的 Rollup/Babel 构建中将它们编译为 ES5 兼容的串联字符串。
我已经在 https://github.com/rollup/awesome#templating 上尝试了一些模板插件,但不想添加另一个模块库作为每个实验的依赖项。我能够使用几个插件将 HTML 作为模板文字导入,但由于某些原因,它们无法通过 babel 编译为 ES5 兼容字符串。 Babel 似乎只将内联(未导入)模板文字编译为连接字符串。其他一切都能正确编译为 ES5。不确定为什么不包括外部 HTML 字符串。也许我的问题是 babel 配置?
我们在 Webpack 构建中使用的方法使用 html-es6-template-loader,它内置了编译功能,因此它可以开箱即用地生成 ES5 兼容的字符串连接。类似的东西可能是理想的。
这是我当前的配置。在这里使用 posthtml 但我尝试了多个插件,结果相同。
import babel from 'rollup-plugin-babel';
import posthtml from 'rollup-plugin-posthtml-template';
export default {
input: './src/index',
output: {
file: './dist/index.js',
format: 'cjs'
},
plugins: [
posthtml({
template: true
}),
babel({
exclude: 'node_modules/**',
presets: ['@babel/preset-env']
})
]
}
理想场景以HTML文件为模板,使用es6 ${}语法,导入JS文件,编译为内联字符串的JS文件。
template.html
<div class="some-div">hello ${data.entity}</div>
index.js用现代ES版本编写
import template from './template.html';
console.log(template({entity="world"})); // logs: <div class="some-div">hello world</div>
我希望结果是与 ES5 兼容的编译脚本,而不需要额外的模板代码。结果类似于下面的代码。
var template = function(data){
return '<div class="some-div">hello ' + data.entity + '</div>';
}
console.log(template({entity="world"})); // logs: <div class="some-div">hello world</div>
我想出了解决办法。我只需要将 HTML 添加到 babel 配置中。我之前不认为这是必需的,因为我认为 babel 在 HTML 被导入并转换为模板文字后才解析 JS 文件,但我想它是必需的。
我在浏览 docs on external dependencies for rollup-plugin-babel
时发现了这一点babel({
exclude: 'node_modules/**',
presets: ['@babel/preset-env'],
extensions: ['.js', '.html']
})
如果您只想将 .html
文件作为字符串导入,那么您也可以尝试使用 rollup-plugin-html
:
// rollup.config.js
import html from "rollup-plugin-html";
export default {
input: "./index.js",
plugins: [
html({
include: "**/*.html",
}),
],
output: {
file: "my-module.js",
name: "MyModule",
format: "umd",
},
};