Skip to content

Correção da importação dinâmica #6

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

Merged
merged 1 commit into from
Aug 23, 2020
Merged

Correção da importação dinâmica #6

merged 1 commit into from
Aug 23, 2020

Conversation

Oda2
Copy link
Contributor

@Oda2 Oda2 commented May 9, 2020

Boa noite André, essa é uma proposta para a correção de importação dinâmica, não necessariamente é a melhor solução.

Problema:

Ao se criar um componente com importação dinâmica da seguinte maneira:

  const LibTeste = '@material-ui/core/Grid';
  const [Comp, setComp] = useState(null);
  const handleTeste = () => {
    setComp(React.lazy(() => import(`${LibTeste}`)));
  };

A transpilação para o babel gera algo como:

  var handleTeste = function handleTeste() {
    setComp(_react.default.lazy(function () {
      return Promise.resolve("".concat(LibTeste)).then(function (s) {
        return (0, _interopRequireWildcard2.default)(require(s));
      });
    }));

Problemática desta transpilação é que o webpack não consegue interpretar require como uma variável o correto seria a própria string, este bug começou a ocorrer atualmente nas última versão do preset-env.

Exemplo da forma correta de saída para o webpack:

  var LibTeste = '@material-ui/core/Grid';
  var handleTeste = function handleTeste() {
  setComp(_react.default.lazy(function () {
    return Promise.resolve().then(function () {
      return (0, _interopRequireWildcard2.default)(require("".concat(LibTeste)));
    });
  }));

Por isso que eu disse que a proposta é uma possível solução (não sendo a melhor) pois a saída com essa implementação seria algo como:

  var LibTeste = '@material-ui/core/Grid';
  var handleTeste = function handleTeste() {
    setComp(_react.default.lazy(function () {
      return import("".concat(LibTeste));
    }));
  };

Não compatível com todos os navegadores 😢

@andrelmlins
Copy link
Owner

Importação dinâmica não é algo tão comum em biblioteca. O melhor seria ter uma solução que funcionasse para todos os navegadores.

@Oda2
Copy link
Contributor Author

Oda2 commented May 13, 2020

Concordo, inclusive estava realizando uns teste fazendo com rollup seguindo o mesmo model de configurações proposto e a saída é algo em torno disso:

    var handleClick = function handleClick() {
      var arroz = '@material-ui/core/Grid';
      setMyComponent(React__default.lazy(function () {
        return import("".concat(arroz));
      }));
    };

Olhando para a implementação de saída não vejo problema a nível de compatibilidade hoje em dia como o link abaixo:

https://caniuse.com/#feat=es6-module-dynamic-import

o que você acha?

@andrelmlins andrelmlins merged commit 183a3ac into andrelmlins:master Aug 23, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants