Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Babel 7+ com polyfill core-js e SystemJS

Olá pessoal!

Gostaria de ajuda para configurar a versão mais nova do Babel (7.4.0+) no projeto. Essa versão do babel usa o core-js como polyfill e ele é ativado nos plugins.

O meu problema é que o SystemJS não está funcionando bem com esse conjunto. Ao transpilar o código, o Babel não coloca o caminho certo dos arquivos do core-js nem a extensão dos arquivos. Por exemplo:

System.register(["@babel/runtime-corejs3/core-js-stable/instance/concat", "@babel/runtime-corejs3/core-js-stable/instance/pad-start", "@babel/runtime-corejs3/core-js-stable/instance/reverse", "@babel/runtime-corejs3/core-js-stable/instance/map", "@babel/runtime-corejs3/helpers/construct", "@babel/runtime-corejs3/helpers/toConsumableArray", "@babel/runtime-corejs3/helpers/classCallCheck", "@babel/runtime-corejs3/helpers/createClass"], function (_export, _context) { ... }

Os arquivos não começam com "node_modules" nem com um caminho relativo a eles e nem terminam com ".js".

No meu index.html a configuração do SystemJS está assim:

<script src="node_modules/systemjs/dist/system.js"></script>
<script>
        System.config({
            packages: {
                "./build/js": {
                    defaultExtension: "js"
                },
                "./node_modules": {
                    defaultExtension: "js"
                }
            }
        });
        System.import("build/js/index.js").catch(err => console.error(err));
</script>

E o meu babel.config.json está assim:

{ 
    "presets": ["@babel/env"],
    "plugins": [
        [
            "@babel/plugin-transform-runtime", {
                "corejs": "3"
            }
        ],
        ["@babel/plugin-transform-modules-systemjs"]
    ]
}

Ao carregar o projeto ocorrem os erros abaixo:

system.js:4 GET http://localhost:3000/@babel/runtime-corejs3/core-js-stable/instance/concat 404 (Not Found)
Error: Fetch error: 404 Not Found
    at system.js:4
    at async Promise.all (:3000/index 0)

GET http://localhost:3000/@babel/runtime-corejs3/core-js-stable/instance/pad-start 404 (Not Found)

e assim por diante para todos os polyfills importados pelo babel.

O projeto todo está no link do google drive abaixo. Agradeço antecipadamente a ajuda de todos.

https://drive.google.com/open?id=1y5-xr46a449paumGxkYeG-r-tjFtz2UX

5 respostas

Fala ai Alexsandra, tudo bem? Para realizar essa configuração vai exigir muito esforço e atualmente a gente não usa mais o SystemJS, é muito dificil, isso porque existem melhores práticas para trabalhar com módulos, no caso Webpack.

Caso queira, no meu tenho dois vídeos explicando e falando sobre Webpack:

E aqui na Alura também temos curso do mesmo, porém, está um pouco desatualizado, mas, vale a pena o conhecimento:

Sendo assim, acho que o ideal seria você manter a versão do Babel e bibliotecas do curso e nos próximos projetos fazer com o Babel e Webpack mais novo (caso sejam projetos complexos que precisem deles).

Se for projetos mais simples, temos outros meios.

Espero ter ajudado.

Muito obrigada pela resposta Matheus.

Eu havia tentado usar o Webpack outra vez com um site estático, mas acabei achando muito complicado de usar (configurar o carregamento e imagens SVG, criar bundles diferentes de CSS e JS, etc) em comparação ao Gulp, que já usei em outra ocasião. O curso aqui da Alura eu achei meio complicado também e não resolvia o que eu queria fazer no site estático.

De qualquer forma vou olhar sua playlist pra ver se me ajuda.

Para o projeto atual, como é apenas o projeto do curso, acabei deixando sem a importação dos polyfills mesmo, mas usando o babel 7.8+ com o SystemJS.

Obrigada mais uma vez!

Magina Alexsandra.

Realmente, o Webpack para sites estáticos nem faz sentido ser utilizado, para esses cenários recomendaria o Gulp mesmo.

O Webpack é bom para problemas mais arquiteturas/cenários mais complexos.

Sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.

solução!

Matheus, eu consegui fazer a configuração necessária para o Babel 7.8+ rodar com core-js3 para os polyfill no SystemJS (questão inicial do tópico).

Segue a configuração:

System.config({
            paths: {
                // paths serve as alias
                'npm:': 'node_modules/'
            },
            map: {
                "@babel": "npm:@babel",
                "core-js-pure": "npm:core-js-pure"
            },
            packages: {
                "build/js": {
                    defaultExtension: "js"
                },
                "@babel": {
                    defaultExtension: "js"
                },
                "core-js-pure/stable/instance": {
                    defaultExtension: "js",
                    main: "bind"
                },
                "core-js-pure/es/instance": {
                    defaultExtension: "js",
                    main: "bind"
                },
                "core-js-pure/stable/promise": {
                    defaultExtension: "js",
                    main: "index"
                },
                "core-js-pure/symbol": {
                    defaultExtension: "js",
                    main: "index"
                },
                "core-js-pure/features/symbol": {
                    defaultExtension: "js",
                    main: "index"
                },
                "core-js-pure/es/promise": {
                    defaultExtension: "js",
                    main: "index"
                },
                "core-js-pure/es/symbol": {
                    defaultExtension: "js",
                    main: "index"
                },

                "core-js-pure/stable": {
                    defaultExtension: "js",
                },
                "core-js-pure/es": {
                    defaultExtension: "js",
                },
                "core-js-pure/modules": {
                    defaultExtension: "js",
                },
                "core-js-pure/internals": {
                    defaultExtension: "js",
                },
                "core-js-pure/features": {
                    defaultExtension: "js",
                }
            }
        });

Primeiro defini um alias para o "node_modules" chamado "npm" no paths da configuração. Depois, nos packages, defini cada modulo que a aplicação estava importando automaticamente do core-js e defini da extensão padrão e, em alguns casos, o "main".

O problema dessa abordagem é que é preciso ficar adicionando novos mapeamentos a medida que novos polyfills sejam usados.

Fiz essa solução com base na configuração do Firebase para Angular. Peguei daqui: https://github.com/angular/quickstart/blob/master/src/systemjs.config.js http://www.fabricadecodigo.com/como-criar-um-aplicativo-com-firebase-realtime-database-e-angular/

Muito bom Alexsandra, parabéns pela solução e obrigado por compartilhar.

Abraços e bons estudos.