Skip to content
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

Open
nigelzor opened this issue Oct 15, 2021 · 12 comments
Open

Build fails if more than one file includes a tagged template literal #7101

nigelzor opened this issue Oct 15, 2021 · 12 comments

Comments

@nigelzor
Copy link

nigelzor commented Oct 15, 2021

🐛 bug report

Parcel generates invalid javascript when more than one file includes a tagged template literal.

🎛 Configuration (.babelrc, package.json, cli command)

{
  "browserslist": ["defaults"]
}

🤔 Expected Behavior

The build should succeed.

😯 Current Behavior

$ parcel build src/index.html
🚨 Build failed.

@parcel/optimizer-terser: "_" is redeclared

    2885 | 
  > 2886 | let _ = (t)=>t
  >      |    ^ "\_" is redeclared
    2887 | , t;
    2888 | const $85deba37093b6689$export$c9cacf6069bed432 = $cc85e8b8e7405a89$export$2e2bcd8739ae039.div(t || (t = _`

  💡 It's likely that Terser doesn't support this syntax yet.

With --no-optimize, a SyntaxError: 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

Software Version(s)
Parcel 2.0.0
Node 14.17.3
Yarn 1.22.5
Operating System
@mischnic
Copy link
Member

mischnic commented Oct 15, 2021

Reproduction (with "browserslist": ["Chrome 40"]):

// 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

@Oupsla
Copy link

Oupsla commented Oct 18, 2021

Hello, got the same problem with parcel (v2) and using styled-components.

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 :

🚨 Build failed.

@parcel/optimizer-terser: "_" is redeclared

    115098 | );
  > 115099 | var $478f3fb9d8f5b7d8$export$2e2bcd8739ae039 = $478f3fb9d8f5b7d8$var$Background;
  >        |    ^ "\_" is redeclared
    115100 | 
    115101 | });

  💡 It's likely that Terser doesn't support this syntax yet.

With "browserslist": "> 0.5%, last 2 versions, not dead",

Removing browserlist from package.json resolve this issue but it removes the optimization from parcel (since terser is not called).

@mebtte
Copy link

mebtte commented Oct 22, 2021

Same issue when updating to 2.0.0 from 2.0.0-rc.
image
image

@bachngotiki
Copy link

bachngotiki commented Oct 27, 2021

Hello, got the same problem with parcel (v2) and using styled-components.

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 :

🚨 Build failed.

@parcel/optimizer-terser: "_" is redeclared

    115098 | );
  > 115099 | var $478f3fb9d8f5b7d8$export$2e2bcd8739ae039 = $478f3fb9d8f5b7d8$var$Background;
  >        |    ^ "\_" is redeclared
    115100 | 
    115101 | });

  💡 It's likely that Terser doesn't support this syntax yet.

With "browserslist": "> 0.5%, last 2 versions, not dead",

Removing browserlist from package.json resolve this issue but it removes the optimization from parcel (since terser is not called).

Thanks for your tip.
Yes. But also your code now might not run on older browsers.

@tbassetto
Copy link

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?

@mischnic
Copy link
Member

This is still broken in Parcel even though swc version was bumped since then. (You can test this with the nightly version)

@michielvanderros-tomtom
Copy link

michielvanderros-tomtom commented Dec 21, 2021

The tip about .browserlistrc did the trick for me. I went over the lines one by one, and I still had safari >= 10.1 in there. Removing this did the trick, despite even still having IE11 on the list.

Update: Pinpointed it more precisely. The issue for me is triggered by supporting ios_saf 12.2-12.5. This get included in the defaults setting and by usage > 0.5%. Adding an extra rule not ios_saf < 13 fixed the issue of the _ redeclaration tripping Terser.

@avsmithy
Copy link

Adding the not ios_saf < 13 rule to the sample project (https://github.com/nigelzor/parcel-bad-tagged-templates) allows it to compile. Thanks for the workaround @michielvanderros-tomtom!

ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Jan 19, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Feb 1, 2022
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.
@jeffpeck10x
Copy link
Contributor

jeffpeck10x commented Feb 1, 2022

I am having this issue in a project that is using parcel@2.1.1.

Setting browserslist to the following seems to fix parcel build:

  "browserslist": [
    "defaults",
    "not ios_saf < 13"
  ],

Whereas doing this does NOT work:

"browserslist": "> 0.5%, not op_mini all, not ie 11, not ios_saf < 13",

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 parcel serve regardless of browserslists, throwing this at runtime:

Uncaught SyntaxError: Identifier '_' has already been declared

Is there another workaround for that, or anything that I might be missing?

@jeffpeck10x
Copy link
Contributor

Please disregard my previous comment. Indeed, adding not ios_saf < 13 to the browserslist fixes it.

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 --no-optimize so I never saw an error message.

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 browserslist in that project, following the advise of this thread.

Once I went back to the previous project and "fixed" it by putting not ios_saf < 13 in the browerslist, everything was all good (at least for everybody who has ever updated ios some time in the last 3 years)

ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Feb 3, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Feb 3, 2022
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.
0x77dev added a commit to dstack-js/dstack that referenced this issue Feb 5, 2022
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Mar 3, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Mar 3, 2022
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.
Alduino added a commit to Alduino/alduino.dev that referenced this issue Mar 7, 2022
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Mar 31, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Mar 31, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 6, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 6, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 6, 2022
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.
davidbgk pushed a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 8, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 12, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 12, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 12, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 12, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 12, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 14, 2022
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.
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 25, 2022
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
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 28, 2022
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
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 28, 2022
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
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue Apr 28, 2022
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
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue May 4, 2022
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
ronnix added a commit to Delegation-numerique-en-sante/mesconseilscovid that referenced this issue May 4, 2022
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
@sladg
Copy link

sladg commented May 9, 2022

Experiencing same issue once I use "default" for Browserlist.
Running Parcel 2.5.0

@aehrenthal
Copy link

aehrenthal commented May 11, 2022

Experiencing the same issue with Parcel 2.5.0 when using Iterators.

.browserslistrc

chrome >= 79
firefox >= 85
safari >= 13
edge >= 88

index.ts

export * from "./IteratorOne";
export * from "./IteratorTwo";

IteratorOne.js

export class IteratorOne {
  iterable;

  constructor(users) {
    this.iterable = users;
  }

  *[Symbol.iterator]() {
    yield* this.iterable;
  }

  testMethod() {
    console.log("test one");
  }
}

IteratorTwo.js

export class IteratorTwo {
  iterable;

  constructor(cars) {
    this.iterable = cars;
  }

  *[Symbol.iterator]() {
    yield* this.iterable;
  }

  testMethod() {
    console.log("test two");
  }
}

It produces the following output
Screen Shot 2022-05-11 at 09 41 48

The following .browserslistrc seems to work

chrome >= 79
firefox >= 90
safari >= 15
edge >= 88

Screen Shot 2022-05-11 at 09 55 05

The suggested solution of

  "browserslist": [
    "defaults",
    "not ios_saf < 13"
  ],

does not fix this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests