Estou tentando obter o compartilhamento de código TypeScript em um aplicativo criar-reagir no modo não ejetar, mas estou enfrentando a infame restrição de que as importações de fora srcnão são permitidas:
You attempted to import ../../common/src/lib.ts which falls outside of the project src/ directory. [...]
Para o caso não-TypeScript, isso foi perguntado e respondido aqui , mas não consigo fazer nenhuma das soluções funcionar com o TypeScript. Especificamente, os problemas com as soluções propostas são:
Configuração baseDirem ts-config.json: Aqui, o create-react-app reclama sobre: Seu projeto baseUrlsó pode ser definido como srcou node_modules. O aplicativo Create React não suporta outros valores no momento.
Abordagens baseadas em react-app-rewired: Mais promissor. Desativar o ModuleScopePluginfaz com que eu ultrapasse o erro "tentativa de importação fora de src", mas o problema agora é que o carregador de arquivos typescript não funciona:

Eu verifiquei que o .tspróprio está bom: Copiar ./srce importar de lá funciona bem.
Também adicionei uma ../../common/srcpasta à includeslista em ts-config.json.
Meu palpite é que de alguma forma a configuração do carregador do webpack tem uma regra que impede o carregador do TypeScript de transpilar arquivos que não correspondem aos padrões de caminho esperados. Como isso pode ser corrigido usando react-app-rewired?
Symlinking sources também não funciona - novamente com o mesmo problema. Provavelmente porque o webpack resolve internamente os links simbólicos e vê o arquivo em um caminho onde as regras normais do carregador não se aplicam.
Soluções baseadas em ejeção: Eu gostaria de não ejetar por enquanto, mas tentei e basicamente estou encontrando o mesmo problema novamente.
Também encontrei outras perguntas que pareciam relacionadas, mas não responderam ao problema:
Reutilizar tipificações TypeScript em um repo mono parece ser um padrão bastante razoável. Estou perdendo alguma coisa ou por que o aplicativo criar-reagir está tornando isso tão difícil?
Para reproduzir: Meu código é basicamente 100% do que você obtém
npx create-react-app my-app --template typescript
com uma importação para externa adicionada.
Você pode usar craco (override de configuração de criação-reação-app) para substituir a configuração do webpack (abstraída como parte do CRA) sem ejetar.
Além disso, você pode usar ts-loaderpara fazer referência a código ts não transpilado diretamente em projetos externos (por exemplo, se quiser fazer referência / usar código / lib compartilhado como parte de um mono-repo).
Supondo que seu aplicativo CRA esteja no clientdiretório, a estrutura de seu projeto é assim:
client/
|--src/
|--package.json
shared/
|--package.json
|--(ts files)
package.json
cd client
yarn add -D @craco/craco ts-loader
craco.config.jsarquivo no client/diretório (CRA)craco.config.jstem o seguinte conteúdoconst path = require("path");
module.exports = {
webpack: {
configure: webpackConfig => {
// ts-loader is required to reference external typescript projects/files (non-transpiled)
webpackConfig.module.rules.push({
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
options: {
transpileOnly: true,
configFile: 'tsconfig.json',
},
})
return webpackConfig;
}
}
};
react-scriptscomandos client/package.jsonporcraco/* client/package.json */
"scripts": {
- "start": "react-scripts start",
+ "start": "craco start",
- "build": "react-scripts build",
+ "build": "craco build"
- "test": "react-scripts test",
+ "test": "craco test"
}
ATUALIZAÇÃO : Como o react-app-rewired é mantido apenas passivamente e não oferece suporte às versões 2+ do CRA (somos as três versões principais posteriores no momento em que este artigo foi escrito), eu não recomendaria mais essa abordagem.
Depois de mais horas experimentando e lendo sobre os problemas do GitHub, finalmente tenho uma solução de trabalho. Muito obrigado a BirukDmitry que fez esta postagem muito útil no GitHub . Guia passo a passo:
Instale o react-app-rewired e customize-cra
npm i react-app-rewired customize-cra --save-dev
Configure react-app-rewird com um mínimo config-overrides.jscomo este:
const { removeModuleScopePlugin, override, babelInclude } = require("customize-cra");
const path = require("path");
module.exports = override(
removeModuleScopePlugin(), // (1)
babelInclude([
path.resolve("src"),
path.resolve("../common/src"), // (2)
])
);
A configuração (1) é semelhante ao que é necessário para contornar a limitação import-outside-src em geral (consulte a pergunta vinculada ).
A configuração (2) é crucial para habilitar a babel-transpilação (e, portanto, incluindo a remoção do tipo TS, presumo) para outros caminhos também. É aqui que você deve adicionar os caminhos dos quais deseja importar.
Não são necessárias adaptações para tsconfig.json.
Importe usando caminhos relativos, por exemplo import * as mymodule from '../../common/src/mymodule',.
pergunta onde ../../common/src/mymodulemora? é outro projeto? Se for outro projeto, por que você não os vincula
dentro do projeto de código comum executado npm link
dentro do projeto que usará o código comum: npm link common-project
Se não houver dois projetos diferentes. por que tem que estar fora do src?
O link que você postou A restrição de importação criar-reagir-app fora do diretório src e seu caso / problema são duas coisas totalmente diferentes, além de serem muito difíceis. deixe-me dar uma ideia desse problema e do seu.
Como já sabemos, o CRA cria um app de página única do SPA. o que significa que existe apenas um único arquivo html. tudo acontece no index.htmlqual está localizado <project>/public/index.html. Se compilarmos o código, notaremos algo que o pacote final pode se parecer com isso
build
--static
----js
----css
----media
--index.html
--...more hashed crap...
public
src
e por padrão process.env.PUBLIC_URLé definido como "/" O QUE ?? 🤨 sim olhe, deixe-me mostrar a você. Diz-se que uma imagem explica mais de 1000 palavras.
se olharmos para a imagem que de acordo com o seu caminho ela está localizada ./src/styles/imageSlack.jpgou alguma. E daí se nós console.log isso.

WHAAAT !! onde eles fazem isso? uma coisa que você pode fazer para testar minha teoria é se você estiver em console.log(process.env.PUBLIC_URL)algum lugar no seu código. agora aqui está a grande diferença entre isso e aquilo.
Os navegadores nativamente não conhecem o Typescript.
Portanto, ou você define o código interno srce nós terminamos felizes ou segue o princípio de separação de preocupações e criamos um pacote npm com o código compartilhado e apenas importado como qualquer outro módulo.
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.