Je voudrais servir de manière statique un projet, qui utilise des composants web (en utilisant lit-html), sans aucun outil de packaging comme webpack etc .
L'exemple de projet est composé de cette structure:
{ "imports": { "app": "./app.js", "lit-element": "./node_modules/lit-element/lit-element.js", "lit-html": "./node_modules/lit-html/lit-html.js" } }
package.json
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> </head> <body> <script type="systemjs-importmap" src="systemjs.map.json"></script> <script src="./node_modules/systemjs/dist/system.min.js"></script> <script> System.import('app'); </script> <x-foo></x-foo> </body> </html>
app.js
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title></title> <script src="app.js" type="module"></script> </head> <body> <x-foo></x-foo> </body> </html>
et enfin, index.html
:
import { LitElement, html } from 'lit-element'; class FooElement extends LitElement { render() { return html`<div>hello world!</div>`; } } window.customElements.define('x-foo', FooElement);
Je sers ceci en utilisant un serveur http statique et, bien sûr, cela ne fonctionne pas. Le navigateur génère l'erreur: Erreur de résolution du spécificateur de module: lit-element
.
Nous essayons donc de modifier la directive import
en:
import {LitElement, html} depuis './node_modules/lit-element/lit-element.js';
Le navigateur échoue alors avec: Erreur lors de la résolution spécificateur de module: lit-html
dans lit-element.ts:14:29
J'ai essayé d'utiliser systemjs
version 3.0.1
avec le index.html
{ "name": "lit", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@webcomponents/webcomponentsjs": "^2.2.7", "lit-element": "^2.0.1" } }
modifié suivant et un code systemjs.map.json > fichier:
index.html app.js package.json
Lors du chargement de ceci (à nouveau via un serveur Web statique), nous obtenons dans Firefox:
les déclarations d'importation ne peuvent apparaître qu'à niveau supérieur d'un module
à app.js:1
.
Dans Chrome:
Uncaught SyntaxError: jeton inattendu {
à app.js:1
Dans Safari:
Jeton inattendu '{'. l'appel d'importation attend exactement un argument.
à app.js:1
Tout cela suggère que systemjs
ne traite pas app.js
en tant que module.
Y a-t-il de toute façon que nous pouvons réaliser le chargement statique de modules qui ont une arborescence de dépendances dans node_modules
?
J'ai poussé la version du code avec systemjs
à https://github.com/dazraf/lit-test a>.
Merci.
3 Réponses :
Nous avons un serveur qui fait exactement cela, et seulement ceci: https: //open-wc.org/developing/owc-dev-server.html
C'est un serveur simple qui fait le minimum de travail requis et est spécialement conçu pour fonctionner avec le chargeur de module es natif disponible dans tous les principaux navigateurs.
À l'avenir, cela ne devrait plus être nécessaire lorsque les cartes d'importation seront standardisées.
/ p>
Merci! J'essaye d'éviter tout outil côté serveur. Quelques raisons, liées à la minimisation des frictions dans les grandes organisations, ainsi qu'à l'utilisation d'un serveur HTTP2 haute performance basé sur JVM. Je peux y entrer sur demande. En attendant, j'ai suivi votre suggestion concernant l'importation de cartes! Semble très bien; quelques mises en garde. Voici une implémentation nominale: github.com/dazraf/lit-test/tree / es-module-shims
Vous pouvez peut-être utiliser quelque chose comme ceci dans votre app.js
<script type="module" src="./app.js">
Et ceci dans votre code HTML
import {LitElement, html} from 'https://unpkg.com/@polymer/lit-element/lit-element.js?module';
Cela a fonctionné pour moi. Si vous ne souhaitez pas utiliser unpkg, vous pouvez le télécharger et le servir localement.
Merci, c'est peut-être la façon la plus propre de faire cela! Je vais essayer et répondre ici.
lit-element a une importation supplémentaire, donc le service local ne fonctionnera pas immédiatement. Vous devez également télécharger la dépendance et modifier l'importation fixe.
Oui, j'ai trouvé la même chose :-) Intéressant. Suggère que la norme actuelle des modules es6 manque quelque chose ...
J'ai eu des problèmes avec les importations de modules avec Electron. Cela pourrait aider gist.github.com/smotaal/f1e6dbb5c0420bfd585874bdf11
Permettez-moi de vous épater. Difficile à trouver, un collègue l'a trouvé.
https: // codewithhugo. com / use-es-modules-in-node-sans-babel / webpack-using-esm /
Désolé, ça n'a pas explosé