Puis-je inline HTML dans un script comme ci-dessous en utilisant une bibliothèque comme jsx:
<script src="jsx-transform.js"></script>
<script type="text/jsx">
define('component', function () {
return (<div>test html code</div>);
});
</script>
J'ai pu écrire des fichiers JSX et les injecter dans une page HTML en utilisant un "faux" React fichier.
no-react.js
/**
* Include this script in your HTML to use JSX compiled code without React.
*/
const React = {
createElement: function (tag, attrs, children) {
var element = document.createElement(tag);
for (let name in attrs) {
if (name && attrs.hasOwnProperty(name)) {
let value = attrs[name];
if (value === true) {
element.setAttribute(name, name);
} else if (value !== false && value != null) {
element.setAttribute(name, value.toString());
}
}
}
for (let i = 2; i < arguments.length; i++) {
let child = arguments[i];
element.appendChild(
child.nodeType == null ?
document.createTextNode(child.toString()) : child);
}
return element;
}
};
Compilez ensuite votre jsx.
test.jsx
const title = "Hello World";
document.getElementById('app').appendChild(
<div>
<h1>{title}</h1>
<h2>This is a template written in TSX, then compiled to JSX by tsc (the TypeScript compiler), and finally
injected into a web page using a script</h2>
</div>
);
Résultat "test.js" compilé
var title = "Hello World";
document.querySelector('#app').appendChild(React.createElement("div", null,
React.createElement("h1", null, title),
React.createElement("h2", null, "This is a template written in TSX, then compiled to JSX by tsc (the TypeScript compiler), and finally" + " " + "injected into a web page")));
Et enfin, la page HTML qui comprend les deux scripts.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>no-react</title>
<script src="no-react.js"></script>
</head>
<body>
<div id="app"></div>
</body>
</html>
<script src="test.js"></script>
JSX n'est pas un langage de modèle basé sur des chaînes; il compile les appels de fonction JavaScript réels. Par exemple,
<div attr1="something" attr2="other">
Here are some <span>children</span>
</div>
transpile vers
React.createElement("div", {attr1: "something", attr2: "other"},
"Here are some ", React.createElement("span", null, "children")
)
Je cherchais quelque chose comme ça moi-même. Un moyen d'écrire des composants et JSX comme pour des projets simples. Je n'en ai pas trouvé un que j'ai aimé, j'ai donc construit ceci: https://github.com/SagiMedina/Aviya#aviya Jetez un coup d'œil, cela répondra peut-être aussi à votre problème.
React restitue la syntaxe html JSX en JS en utilisant des fonctions telles que React.createElement (entre autres pour Fragments et ainsi de suite). Mais tout se résume au plugin @ babel/plugin-transform-react-jsx qui effectue le transpiling de ceci:
return(<div id="hello">Hello World</div>)
dans ce ...
return React.createElement('div', {id: 'hello'}, 'Hello World');
Cependant, vous pouvez remplacer React.createElement par votre propre fonction pour ce faire. Vous pouvez en savoir plus à ce sujet ici: https://babeljs.io/docs/en/next/babel-plugin-transform-react-jsx.html
Vous devriez également regarder les bibliothèques qui font exactement cela, comme nervjs , jsx-render et dek . Tous ces éléments utilisent une syntaxe html JSX sans réagir. Certains (tels que le rendu jsx) se concentrent uniquement sur la conversion de JSX en JS final, ce qui pourrait être ce que vous recherchez.
L'auteur de ce package a écrit un article à ce sujet ici: https://itnext.io/lessons-learned-using-jsx-without-react-bbddb6c28561
TypeScript peut également le faire si vous l'utilisez ... mais je n'ai aucune expérience de première main.
Pour résumer
Vous pouvez le faire sans React, mais pas sans Babel ou TypeScript.
Vous pouvez consulter la documentation: transformation JSX dans le navigateur , et voir également documentation Babel
Vous pouvez réaliser ce que vous voulez, mais c'est découragé dans la production ...
Jsx analyse la return (<div>test html code</div>);
vers quelque chose comme ça return React.createElement('div', {...});
alors si vous n'utilisez pas react.js
, le navigateur ne saura pas ce qu'est React
et déclenchera une erreur.