我认为问题是是否可以同时使用具有两种或多种类型的脚本标签(例如 type="module, txt/babel" 之类的东西)。据我所知,答案是否定的。
JonDotsoy 的回答有助于减少一遍又一遍地键入 React.createElement,但即使使用这样的“可变快捷方式”,在使用带有嵌套元素的较大模板时它也不像 JSX 那样舒服,因为在这种情况下难以维护 h('div', {}, 'hello!!')...。
我发现在不使用任何构建工具的情况下将原生浏览器模块支持和 JSX 的浏览器内 Babel 结合起来的唯一方法是……这是一个相当肮脏的 hack,它使用 eval,不应该用于生产应用程序:
index.html
<body>
<div id="app"></div>
<!-- Scripts ------- -->
<script src="vendor/js/babel.min.js"></script>
<script src="vendor/js/react.development.js"></script>
<script src="vendor/js/react-dom.development.js"></script>
<script src="app/app.js" type="module"></script>
</body>
app/app.js
import ComponentOne from "./ComponentOne.js";
let template = `
<div>
<h1>Heading</h1>
<hr />
<ComponentOne msg="MsgText-ComponentOne" />
</div>
`;
const App = () => {
return (
eval(Babel.transform(template, { presets: ['es2017', 'react'] }).code)
);
};
ReactDOM.render(
React.createElement(App, null),
document.getElementById("app")
);
app/ComponentOne.js
import ComponentTwo from "./ComponentTwo.js";
let template = `
<div>
<h2>This is ComponentOne</h2>
<p key="2">Property "msg" content: {props.msg}</p>
<ComponentTwo msg="MsgText-ComponentTwo" />
</div>
`;
const ComponentOne = (props) => {
return(
eval(Babel.transform(template, { presets: ['es2017', 'react'] }).code)
);
};
export default ComponentOne;
app/ComponentTwo.js
let template = `
<div>
<h2>This is ComponentTwo</h2>
<p key="2">Property "msg" content: {props.msg}</p>
</div>
`;
const ComponentTwo = (props) => {
return(
eval(Babel.transform(template, { presets: ['es2017', 'react'] }).code)
);
};
export default ComponentTwo;