배럴 모드: 가져오기 de mó dulos de forma elegante em JavaScript
소개
Varios mó dulos emum arquivo 기지의 수출통입니다.Em resumo,Stão arquivos que re exportam partes selecionadas de seu módulo._maté cnica usada por muitas aplica öes, 각도, 반응 e Vue 포함.
Provavelmente vocêjáse deparou com importaçes neste formato:
// Vue
import { defineComponent, reactive, computed } from 'vue';
// Angular
import { Router, Route, ActivatedRoute } from '@angular/router';
Como Angular e Vue utilizam monorepo,ou seja,temos uma separaão da aplicaão em packages com responsibilidades definidas,éconveniente que as partes importantes des packages sejam agrupados e exportados em um arquivo base que arroga a tarefa de ser o ponto central de acesso as partes daquele módulo.Também vale ressattle que esta abodagem não se restring a monorepo.모도로스 수입
Com a massiva atualiza ço JavaScript recebeu em 2015(일명 ES6), dentre as novas functionalidades recebemos o ESModules:um sistema office de m ó dulos para o JavaScript.Havia alternativas como CommonJS e RequireJS,mas agora temos o supporte a módulos nativamente.Se deseja entender um pouco mais a fundo sobre módulos,indico capítulo do livro do Dr.Axel Rauschmayer:Impatient Programmers - Modules.Ressalva:tambémépossível utilizar Barrel Pattern com CommonJS,mas me restringirei a explicálo com módulos nativos.
O 컨텍스트
Agora imaginemos um contexto:se estamos trabalhando com um Design System que se utiliza da filosofia Atomic Design,logo mais chegaremos a uma situaão semelhante em diversas partes da nossa aplicaão:
// Navbar.vue
import Menu from './components/menu/Menu';
import MenuList from './components/menu/MenuList';
import MenuItem from './components/menu/MenuItem';
import MenuLink from './components/menu/MenuLink';
import Select from './components/select/Select';
import SelectList from './components/select/SelectList';
import SelectOption from './components/select/SelectOption';
Percebemos que estamos importando 4개 구성 요소 다 파스타 메뉴 e 3 다 파스타 선택, repetindo caminho de diret órios e alterando apenas o nome do componente.물론 우아한 갑옷 경기였다.Vejamos um Examplo com 배럴:// Navbar.vue
import {
Menu,
MenuList,
MenuItem,
MenuLink
} from './components/menu';
import {
Select,
SelectList,
SelectOption
} from './components/select';
Agora temos uma sintaxe mais enxuta,não precisando repetir o nome do component de evido a desestruturaão do objeto que o arquivo barrel de cada módulo exporta.Porém,ainda podemos melhorar.Caso não tenha familidade com o concito de desestruturaão de objetos e array,indico como referenceência:JavaScript.info - Destructuring Assignment.
인공 유산
Como jávimos,épossível desestruturar um objeto exportado e extrair somente o que nosénecesário.Então,vamos entender como functiona um arquivo barrel(o arquivo que exporta a API pública do módulo).
Vejamos como o Angular exporta partes do package@Angular/router:
Analise naíntegrae veja que existe um arquivo index.ts exportando partes de router.A escolha do nome do arquivo nãoépor acaso.sistema de mó dulos, quando Referenceiamos uma pasta, ébuscado inicialmente por um arquivo index
Levando em conta,assim ficaria nossa pasta components em uma aplicaço Vue:
components
├── menu
│ │── Menu.vue
│ │── MenuList.vue
│ │── MenuItem.vue
│ │── MenuLink.vue
│ └── index.js <-- arquivo barrel
├── select
│ │── Select.vue
│ │── SelectList.vue
│ │── SelectOption.vue
│ └── index.js <-- arquivo barrel
Agora exportamos os componentes que desejamos:
// components/menu/index.js
export { default as Menu } from './Menu.vue';
export { default as MenuList } from './MenuList.vue';
export { default as MenuItem } from './MenuItem.vue';
export { default as MenuLink } from './MenuLink.vue';
빠르다.Ao acessarmos components/menu,o arquivo barrel(index.js)seráchamado e retronaráum merge dos objetos com nossos components,e então poderemos usar a desstruturaão para extrair o que realmente precisamos:
// Navbar.vue
import { Menu, MenuList } from './components/menu';
Melhorando a Aboradagem 회사
A abordagem acimaébem interestsante,porémébom ficar atento para nãexagerar no uso de barkes.Nós Não queremos ter muitos arquivos,pois issoécontraproducente e geralmente leva a problemas de dependencia circular queás vezes podem ser bem complados de resolver
O 추천cada mó dulo tenhaum arquivo barrel,delegando ao mesmo a responsibilidade de exportar as suas partes as convenients.API pública e ser response ável por encular o acesso de suas partes를 개발합니다.Caso a localizaão de uma interna seja alterada,aqueles que utilizam seu módulo não devem ser afetados
Sabendo disso,podemos colocar um arquivo barrel na raiz da pasta components e exportar suas partes internas de forma concentrada:
components
├── index.js
├── menu
│ └── ...
├── select
│ └── ...
Agora podemos exportar de duas formas:
개인, sendo assim, n ão éneces á rio um arquivo barrel em cada pasta interna referent a um componente(recomendado):
// components/index.js
export { default as Menu } from './menu/Menu.vue';
export { default as MenuList } from './menu/MenuList.vue';
export { default as MenuItem } from './menu/MenuItem.vue';
export { default as MenuLink } from './menu/MenuLink.vue';
export { default as Select } from './select/Select.vue';
export { default as SelectList } from './select/SelectList.vue';
export { default as SelectOption } from './select/SelectOption.vue';
Ou reaproveitando os arquivos barges e re exportando no arquivo barrel base do módulo:
// components/index.js
export * from './menu';
export * from './select';
최종 결과가 없음:
// Navbar.vue
import { Menu, MenuList, Select, SelectList } from './components';
Conseguimos acessar todos os nossos components apenas referenceanicando a 파스타 구성 요소.Não precisamos saber quais components estão lá,nem lembrar das subpastas que exportam algo.Tudo o que estáacessível para importar encontra se no arquivo barrel base(API pública do módulo)
Dica:se vocèusa o VSCode,apertandoCtrl+Space
dentro das chaves lheésugerido uma lista do queépossível importar:
A indecis ão 회사
provável que vocêtenha se perguntado a differença em utilizarexport * from
vsexport {} from
.유럽연합에 대한 보고서: depende do contextoduas formas de exporta ão usadas처럼 각도/공유기를 하는 예는 없습니다.Preferencialmente,opte por exportaçes descriptivas,ou melhor dizendo,export explícito,assim podemos controlar melhor o que de fato queremos expor
export * from
adiciona um toque de“mágica”.Controlar o que estamos exportandoéum pouco mais difícil,jáque precisaremos ir no arquivo queére exportado para ter uma melhor noço que realmente estásendo exposto.Por outro lado,se vocêtem uma API muito bem definida,partes importantes do seu módulo que não são constantemente alteradas,éplausível utilizar esta forma“mágica”
Avalie o seu contexto e aplique como melhor planejar.Nãoéuma regra.Não terceize suas decisões
결론
Entendemos uma aboradagem para reduzir as repetiões em importaões,melhorar o compatilhamento de código entre módulos specializados,caminhos de arquivos e reduzir quebra de dependencias,e também uma forma mais elegante de manter nosso código
Portanto,este모드comcautela를 사용합니다.Hácontextos em que eleémuitoútil.O problema nãO estáno Barrel Pattern,e sim no mau uso do mesmo
참고
- https://basarat.gitbook.io/typescript/main-1/barrel
- https://medium.com/@adrianfaciu/barrel-files-to-use-or-not-to-use-75521cd18e65
- https://hackernoon.com/react-project-architecture-using-barrels-d086146eb0f6
- http://cangaceirojavascript.com.br/barrels-simplificando-importacoes-de-modulos/
- https://srinivasankk.com/javascript-barrel/
Soli Deo Gloria
Reference
이 문제에 관하여(배럴 모드: 가져오기 de mó dulos de forma elegante em JavaScript), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/exploitmik/barrel-pattern-import-de-modulos-de-forma-elegante-em-javascript-3bj0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)