Posso fazer com que o Reason + React importe o módulo react do CDN?

Nov 06 2020

Construir um componente com Reason e React sempre me dá uma instrução de importação de módulo para "react", que não pode ser encontrada se React for incluído de um CDN. Existe uma solução para isso? Tentei definir window.react = Reactem index.html sem sucesso. es6-globalconfiguração não muda nada.

Não estou usando um programa de empacotamento como o webpack.

Editar: Tópico possivelmente relevante do fórum do Reason: https://reasonml.chat/t/can-one-load-reasonml-es6-modules-without-a-bundler/2219

Problema semelhante (não resolvido): pode-se carregar módulos do reasonml es6 sem um bundler

importmap(ainda não implementado em navegadores) poderia ser outra solução para isso: Usar módulos ES6 sem uma etapa de Transpiler / Bundler

Respostas

3 Yawar Nov 07 2020 at 07:24

Tecnicamente, sim, você pode, mas não vai ser tão fácil quanto seguir o fluxo do npm e usar um bundler.

As ligações ReasonReact são escritas de forma a produzir JavaScript de saída que importa módulos como:

import * as React from "react";

(Se estiver usando o estilo de módulo ES6.)

Se estiver usando um CDN, você provavelmente deseja uma saída parecida com esta:

import * as React from "https://some.cdn/react";

A sintaxe (do repositório ReasonReact ) que controla o JS de saída é:

[@bs.module "react"]
external createElement: (component('props), 'props) => element = "createElement";

Se você mudou para:

[@bs.module "https://some.cdn/react"]
external createElement: (component('props), 'props) => element = "createElement";

... então você obteria a saída desejada. Mas o problema é que você precisa alterar as fontes ... isto é, manter ou encontrar ligações bifurcadas para o React para esse CDN. Ou configure alguma automação de código que localize e substitua [@bs.module "react"]com [@bs.module "https://some.cnd/react"]. De qualquer forma, não é tão simples quanto usar um bundler.