-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Build fails if more than one file includes a tagged template literal #7101
Comments
Reproduction (with // red.js
export const Red = String.raw`
color: red;
`;
// index.js
import { Red } from "./red.mjs";
const Blue = String.raw`
color: blue;
`;
console.log(Red, Blue); produces: function _templateObject() {
var data = $5e409c1f3bf46915$export$2e2bcd8739ae039([
"\n color: red;\n"
]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var _ = function(t) {
return t;
}, t;
var $51015df37f6ab11b$export$b7d7e6f1815ae490 = String.raw(t || (t = _(_templateObject())));
function _templateObject() {
var data = $5e409c1f3bf46915$export$2e2bcd8739ae039([
"\n color: blue;\n"
]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var _ = function(t) {
return t;
}, t;
var $0147a7bdfc4f9f3f$var$Blue = String.raw(t || (t = _(_templateObject())));
console.log($51015df37f6ab11b$export$b7d7e6f1815ae490, $0147a7bdfc4f9f3f$var$Blue); Might be related: swc-project/swc#2486 |
Hello, got the same problem with parcel (v2) and using I didn't know it was related to tagged template literal but since styled-components use a lot of them, it seems related. If it helps, I got :
With Removing browserlist from package.json resolve this issue but it removes the optimization from parcel (since terser is not called). |
Thanks for your tip. |
Since the linked issue on SWC project is closed, can we expect an update of parcel with the fix soon? Or is there a workaround in the meantime? |
This is still broken in Parcel even though swc version was bumped since then. (You can test this with the nightly version) |
The tip about Update: Pinpointed it more precisely. The issue for me is triggered by supporting ios_saf 12.2-12.5. This get included in the |
Adding the |
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
I am having this issue in a project that is using Setting
Whereas doing this does NOT work:
So, there is probably some other browser in the list that needs to be explicitly removed. Either way though, how can anybody use this solution? It still will not work with
Is there another workaround for that, or anything that I might be missing? |
Please disregard my previous comment. Indeed, adding If anyone is curious, the reason that I still encountered what I did above is because I was using an already built library that contained these tagged template literals AND I had built it with It wasn't until it was dropped into another project running parcel@2.1.1 (not sure if that detail is relevant) that the issue was even noticed, upon which I tried modifying Once I went back to the previous project and "fixed" it by putting |
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On peut contourner le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement.
https://github.com/parcel-bundler/parcel/releases/tag/v2.5.0 https://www.npmjs.com/package/parcel/v/2.5.0 == Notes de migration == - Par défaut, Parcel v2 utilise swc au lieu de Babel pour la transpilation Avantage : c’est plus rapide. Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On contourne le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. - Depuis la 2.4.0, Parcel utilise @parcel/css au lieu de PostCSS (cf. https://parceljs.org/blog/v2-4-0/) - On met à jour les anciens plugins (changement d’API) : - on remplace le plugin [parcel-plugin-static-files-copy](https://www.npmjs.com/package/parcel-plugin-static-files-copy) par [parcel-reporter-static-files-copy](https://www.npmjs.com/package/parcel-reporter-static-files-copy) - on remplace [parcel-plugin-ogimage](https://www.npmjs.com/package/parcel-plugin-ogimage) par [parcel-optimizer-ogimage](https://www.npmjs.com/package/parcel-optimizer-ogimage) - on remplace [parcel-plugin-html-externals](https://www.npmjs.com/package/parcel-plugin-html-externals) par [parcel-resolver-ignore](https://www.npmjs.com/package/parcel-resolver-ignore) - on active le plugin standard `@parcel/resolver-glob` pour utiliser des imports `*` comme dans Parcel V1. - on remplace le plugin [parcel-plugin-sw-asset-urls](https://www.npmjs.com/package/parcel-plugin-sw-asset-urls) par le plugin standard `@parcel/service-worker` (ce qui évite de devoir maintenir à la main la liste de fichiers à mettre en cache) - On s’assure que les noms des bundles soient mcc.XXX.(css|js) Les règles de nommage par défaut de Parcel utilisent l’arbre d’import pour déterminer quel est le nom du fichier racine : https://github.com/parcel-bundler/parcel/blob/v2/packages/namers/default/src/DefaultNamer.js Cela donne des noms un peu arbitraires pour les bundles CSS et JS. On utilise le plugin `parcel-namer-rewrite` pour forcer un nom plus explicite : https://www.npmjs.com/package/parcel-namer-rewrite - On normalise les liens dans les fichiers sources : - lien absolu "/" pour aller vers la page d’accueil - lien relatif "toto.html" pour aller vers une autre page Note: des liens absolus seront bien générés par Parcel au final. - On ajoute un lien vers le fichier `browserconfig.xml` - On note que deux versions du JS sont générées : - une pour les navigateurs modernes capables de charger un script de type "module" - une option de repli pour les navigateurs plus anciens cf. https://parceljs.org/features/targets/#differential-bundling
https://github.com/parcel-bundler/parcel/releases/tag/v2.5.0 https://www.npmjs.com/package/parcel/v/2.5.0 == Notes de migration == - Par défaut, Parcel v2 utilise swc au lieu de Babel pour la transpilation Avantage : c’est plus rapide. Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On contourne le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. - Depuis la 2.4.0, Parcel utilise @parcel/css au lieu de PostCSS (cf. https://parceljs.org/blog/v2-4-0/) - On met à jour les anciens plugins (changement d’API) : - on remplace le plugin [parcel-plugin-static-files-copy](https://www.npmjs.com/package/parcel-plugin-static-files-copy) par [parcel-reporter-static-files-copy](https://www.npmjs.com/package/parcel-reporter-static-files-copy) - on remplace [parcel-plugin-ogimage](https://www.npmjs.com/package/parcel-plugin-ogimage) par [parcel-optimizer-ogimage](https://www.npmjs.com/package/parcel-optimizer-ogimage) - on remplace [parcel-plugin-html-externals](https://www.npmjs.com/package/parcel-plugin-html-externals) par [parcel-resolver-ignore](https://www.npmjs.com/package/parcel-resolver-ignore) - on active le plugin standard `@parcel/resolver-glob` pour utiliser des imports `*` comme dans Parcel V1. - on remplace le plugin [parcel-plugin-sw-asset-urls](https://www.npmjs.com/package/parcel-plugin-sw-asset-urls) par le plugin standard `@parcel/service-worker` (ce qui évite de devoir maintenir à la main la liste de fichiers à mettre en cache) - On s’assure que les noms des bundles soient mcc.XXX.(css|js) Les règles de nommage par défaut de Parcel utilisent l’arbre d’import pour déterminer quel est le nom du fichier racine : https://github.com/parcel-bundler/parcel/blob/v2/packages/namers/default/src/DefaultNamer.js Cela donne des noms un peu arbitraires pour les bundles CSS et JS. On utilise le plugin `parcel-namer-rewrite` pour forcer un nom plus explicite : https://www.npmjs.com/package/parcel-namer-rewrite - On normalise les liens dans les fichiers sources : - lien absolu "/" pour aller vers la page d’accueil - lien relatif "toto.html" pour aller vers une autre page Note: des liens absolus seront bien générés par Parcel au final. - On ajoute un lien vers le fichier `browserconfig.xml` - On note que deux versions du JS sont générées : - une pour les navigateurs modernes capables de charger un script de type "module" - une option de repli pour les navigateurs plus anciens cf. https://parceljs.org/features/targets/#differential-bundling
https://github.com/parcel-bundler/parcel/releases/tag/v2.5.0 https://www.npmjs.com/package/parcel/v/2.5.0 == Notes de migration == - Par défaut, Parcel v2 utilise swc au lieu de Babel pour la transpilation Avantage : c’est plus rapide. Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On contourne le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. - Depuis la 2.4.0, Parcel utilise @parcel/css au lieu de PostCSS (cf. https://parceljs.org/blog/v2-4-0/) - On met à jour les anciens plugins (changement d’API) : - on remplace le plugin [parcel-plugin-static-files-copy](https://www.npmjs.com/package/parcel-plugin-static-files-copy) par [parcel-reporter-static-files-copy](https://www.npmjs.com/package/parcel-reporter-static-files-copy) - on remplace [parcel-plugin-ogimage](https://www.npmjs.com/package/parcel-plugin-ogimage) par [parcel-optimizer-ogimage](https://www.npmjs.com/package/parcel-optimizer-ogimage) - on remplace [parcel-plugin-html-externals](https://www.npmjs.com/package/parcel-plugin-html-externals) par [parcel-resolver-ignore](https://www.npmjs.com/package/parcel-resolver-ignore) - on active le plugin standard `@parcel/resolver-glob` pour utiliser des imports `*` comme dans Parcel V1. - on remplace le plugin [parcel-plugin-sw-asset-urls](https://www.npmjs.com/package/parcel-plugin-sw-asset-urls) par le plugin standard `@parcel/service-worker` (ce qui évite de devoir maintenir à la main la liste de fichiers à mettre en cache) - On s’assure que les noms des bundles soient mcc.XXX.(css|js) Les règles de nommage par défaut de Parcel utilisent l’arbre d’import pour déterminer quel est le nom du fichier racine : https://github.com/parcel-bundler/parcel/blob/v2/packages/namers/default/src/DefaultNamer.js Cela donne des noms un peu arbitraires pour les bundles CSS et JS. On utilise le plugin `parcel-namer-rewrite` pour forcer un nom plus explicite : https://www.npmjs.com/package/parcel-namer-rewrite - On normalise les liens dans les fichiers sources : - lien absolu "/" pour aller vers la page d’accueil - lien relatif "toto.html" pour aller vers une autre page Note: des liens absolus seront bien générés par Parcel au final. - On ajoute un lien vers le fichier `browserconfig.xml` - On note que deux versions du JS sont générées : - une pour les navigateurs modernes capables de charger un script de type "module" - une option de repli pour les navigateurs plus anciens cf. https://parceljs.org/features/targets/#differential-bundling
https://github.com/parcel-bundler/parcel/releases/tag/v2.5.0 https://www.npmjs.com/package/parcel/v/2.5.0 == Notes de migration == - Par défaut, Parcel v2 utilise swc au lieu de Babel pour la transpilation Avantage : c’est plus rapide. Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On contourne le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. - Depuis la 2.4.0, Parcel utilise @parcel/css au lieu de PostCSS (cf. https://parceljs.org/blog/v2-4-0/) - On met à jour les anciens plugins (changement d’API) : - on remplace le plugin [parcel-plugin-static-files-copy](https://www.npmjs.com/package/parcel-plugin-static-files-copy) par [parcel-reporter-static-files-copy](https://www.npmjs.com/package/parcel-reporter-static-files-copy) - on remplace [parcel-plugin-ogimage](https://www.npmjs.com/package/parcel-plugin-ogimage) par [parcel-optimizer-ogimage](https://www.npmjs.com/package/parcel-optimizer-ogimage) - on remplace [parcel-plugin-html-externals](https://www.npmjs.com/package/parcel-plugin-html-externals) par [parcel-resolver-ignore](https://www.npmjs.com/package/parcel-resolver-ignore) - on active le plugin standard `@parcel/resolver-glob` pour utiliser des imports `*` comme dans Parcel V1. - on remplace le plugin [parcel-plugin-sw-asset-urls](https://www.npmjs.com/package/parcel-plugin-sw-asset-urls) par le plugin standard `@parcel/service-worker` (ce qui évite de devoir maintenir à la main la liste de fichiers à mettre en cache) - On s’assure que les noms des bundles soient mcc.XXX.(css|js) Les règles de nommage par défaut de Parcel utilisent l’arbre d’import pour déterminer quel est le nom du fichier racine : https://github.com/parcel-bundler/parcel/blob/v2/packages/namers/default/src/DefaultNamer.js Cela donne des noms un peu arbitraires pour les bundles CSS et JS. On utilise le plugin `parcel-namer-rewrite` pour forcer un nom plus explicite : https://www.npmjs.com/package/parcel-namer-rewrite - On normalise les liens dans les fichiers sources : - lien absolu "/" pour aller vers la page d’accueil - lien relatif "toto.html" pour aller vers une autre page Note: des liens absolus seront bien générés par Parcel au final. - On ajoute un lien vers le fichier `browserconfig.xml` - On note que deux versions du JS sont générées : - une pour les navigateurs modernes capables de charger un script de type "module" - une option de repli pour les navigateurs plus anciens cf. https://parceljs.org/features/targets/#differential-bundling
https://github.com/parcel-bundler/parcel/releases/tag/v2.5.0 https://www.npmjs.com/package/parcel/v/2.5.0 == Notes de migration == - Par défaut, Parcel v2 utilise swc au lieu de Babel pour la transpilation Avantage : c’est plus rapide. Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On contourne le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. - Depuis la 2.4.0, Parcel utilise @parcel/css au lieu de PostCSS (cf. https://parceljs.org/blog/v2-4-0/) - On met à jour les anciens plugins (changement d’API) : - on remplace le plugin [parcel-plugin-static-files-copy](https://www.npmjs.com/package/parcel-plugin-static-files-copy) par [parcel-reporter-static-files-copy](https://www.npmjs.com/package/parcel-reporter-static-files-copy) - on remplace [parcel-plugin-ogimage](https://www.npmjs.com/package/parcel-plugin-ogimage) par [parcel-optimizer-ogimage](https://www.npmjs.com/package/parcel-optimizer-ogimage) - on remplace [parcel-plugin-html-externals](https://www.npmjs.com/package/parcel-plugin-html-externals) par [parcel-resolver-ignore](https://www.npmjs.com/package/parcel-resolver-ignore) - on active le plugin standard `@parcel/resolver-glob` pour utiliser des imports `*` comme dans Parcel V1. - on remplace le plugin [parcel-plugin-sw-asset-urls](https://www.npmjs.com/package/parcel-plugin-sw-asset-urls) par le plugin standard `@parcel/service-worker` (ce qui évite de devoir maintenir à la main la liste de fichiers à mettre en cache) - On s’assure que les noms des bundles soient mcc.XXX.(css|js) Les règles de nommage par défaut de Parcel utilisent l’arbre d’import pour déterminer quel est le nom du fichier racine : https://github.com/parcel-bundler/parcel/blob/v2/packages/namers/default/src/DefaultNamer.js Cela donne des noms un peu arbitraires pour les bundles CSS et JS. On utilise le plugin `parcel-namer-rewrite` pour forcer un nom plus explicite : https://www.npmjs.com/package/parcel-namer-rewrite - On normalise les liens dans les fichiers sources : - lien absolu "/" pour aller vers la page d’accueil - lien relatif "toto.html" pour aller vers une autre page Note: des liens absolus seront bien générés par Parcel au final. - On ajoute un lien vers le fichier `browserconfig.xml` - On note que deux versions du JS sont générées : - une pour les navigateurs modernes capables de charger un script de type "module" - une option de repli pour les navigateurs plus anciens cf. https://parceljs.org/features/targets/#differential-bundling
https://github.com/parcel-bundler/parcel/releases/tag/v2.5.0 https://www.npmjs.com/package/parcel/v/2.5.0 == Notes de migration == - Par défaut, Parcel v2 utilise swc au lieu de Babel pour la transpilation Avantage : c’est plus rapide. Par contre, l’utilisation des tagged template litterals conduit à la génération de code qui déclenche une erreur dans terser (le minifieur) : parcel-bundler/parcel#7101 On contourne le problème en écrivant différemment notre code pour échapper le nom du profil dans le HTML généré dynamiquement. - Depuis la 2.4.0, Parcel utilise @parcel/css au lieu de PostCSS (cf. https://parceljs.org/blog/v2-4-0/) - On met à jour les anciens plugins (changement d’API) : - on remplace le plugin [parcel-plugin-static-files-copy](https://www.npmjs.com/package/parcel-plugin-static-files-copy) par [parcel-reporter-static-files-copy](https://www.npmjs.com/package/parcel-reporter-static-files-copy) - on remplace [parcel-plugin-ogimage](https://www.npmjs.com/package/parcel-plugin-ogimage) par [parcel-optimizer-ogimage](https://www.npmjs.com/package/parcel-optimizer-ogimage) - on remplace [parcel-plugin-html-externals](https://www.npmjs.com/package/parcel-plugin-html-externals) par [parcel-resolver-ignore](https://www.npmjs.com/package/parcel-resolver-ignore) - on active le plugin standard `@parcel/resolver-glob` pour utiliser des imports `*` comme dans Parcel V1. - on remplace le plugin [parcel-plugin-sw-asset-urls](https://www.npmjs.com/package/parcel-plugin-sw-asset-urls) par le plugin standard `@parcel/service-worker` (ce qui évite de devoir maintenir à la main la liste de fichiers à mettre en cache) - On s’assure que les noms des bundles soient mcc.XXX.(css|js) Les règles de nommage par défaut de Parcel utilisent l’arbre d’import pour déterminer quel est le nom du fichier racine : https://github.com/parcel-bundler/parcel/blob/v2/packages/namers/default/src/DefaultNamer.js Cela donne des noms un peu arbitraires pour les bundles CSS et JS. On utilise le plugin `parcel-namer-rewrite` pour forcer un nom plus explicite : https://www.npmjs.com/package/parcel-namer-rewrite - On normalise les liens dans les fichiers sources : - lien absolu "/" pour aller vers la page d’accueil - lien relatif "toto.html" pour aller vers une autre page Note: des liens absolus seront bien générés par Parcel au final. - On ajoute un lien vers le fichier `browserconfig.xml` - On note que deux versions du JS sont générées : - une pour les navigateurs modernes capables de charger un script de type "module" - une option de repli pour les navigateurs plus anciens cf. https://parceljs.org/features/targets/#differential-bundling
Experiencing same issue once I use "default" for Browserlist. |
🐛 bug report
Parcel generates invalid javascript when more than one file includes a tagged template literal.
🎛 Configuration (.babelrc, package.json, cli command)
🤔 Expected Behavior
The build should succeed.
😯 Current Behavior
With
--no-optimize
, aSyntaxError: redeclaration of let _
will be thrown at runtime instead.💁 Possible Solution
🔦 Context
💻 Code Sample
A sample project demonstrating this issue is available here: https://github.com/nigelzor/parcel-bad-tagged-templates
🌍 Your Environment
The text was updated successfully, but these errors were encountered: