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

Paths no require

Bom dia pessoal,

como posso resolver o problema abaixo? Existe algum modulo para escrever paths melhores? Qual a solução mais usada?

//Fica mto dificil de dar manutencao dessa forma
const moduloLocal = require('../../../../helpers/meuhelper')

Valeu!

8 respostas

Bem vindo ao problema dos módulos no javascript :(. Eu não conheço uma forma melhor não... Minha sugestão é que vc cuide das pastas do seu projeto desde a concepção do mesmo...

Eu vi algumas solucoes usando symlinks, ou colocando os modulos dentro da pasta node_modules... mas todos tem cara de gambiarra.

Acho que symlinks nao funcionam no windows, e a pasta node_modules deve ser so para modulos externos.

O que vc sugere como uma boa estrutura de projeto?

Instalar os módulos como dependência do node pode ser uma mesmo... Só acho que vai dar um trabalho grande... acho que não estou disposto a pagar o preço.

Não existe um padrão de mercado quanto a isso, pelo menos eu não conheço. Minha sugestão é pensar mesmo.. quando for separar os arquivos, pensar se aquela pasta faz sentido e tal.

Oi Igor! Há uma solução que talvez você goste. Você pode criar um bridge module. É assim que uso em projetos grandes, principalmente nos meus.

Primeiramente, ele não vai remover os ../../.., mas evita que outros módulos usem o ../../...

Vou tentar explicar. Veja a estrutura desse projeto:

├── base
│   ├── index.js
│   └── views
│       ├── errors
│       │   ├── 404.marko
│       │   ├── 404.marko.js
│       │   └── 500.marko
│       ├── footer.marko
│       ├── footer.marko.js
│       ├── header.marko
│       ├── header.marko.js
│       ├── messages.marko
│       └── messages.marko.js
├── index.js
├── main.js
├── post
│   ├── index.js
│   ├── post-controller.js
│   ├── post-routes.js
│   ├── post-service.js
│   ├── post.js
│   └── views
│       ├── form.marko
│       ├── form.marko.js
│       ├── index.js
│       ├── notfound.marko
│       ├── notfound.marko.js
│       ├── post-view.marko
│       ├── post-view.marko.js
│       ├── posts.marko
│       └── posts.marko.js
└── user
    ├── index.js
    └── user.js

Por exemplo, temos o módulo post. Tudo que diz respeito a post ficam dentro da pasta post. Se você olhar dentro dele, há o arquivo index.js. Todo módulo que possui index.js pode ser importado apenas apontado para a pasta do módulo, por exemplo:


const module = require('./post');

Agora, que tal olharmos o arquivo index.js de post?

const model = require('./post');
const service = require('./post-service');
const routes = require('./post-routes');

module.exports = {
      model,
      service,
      routes
};

Veja que em index.js eu faço os requires (que poderiam ser com ../../.., mas quem vai usar esses módulos, só os usa através do bridge. Veja que ele exporta model, service e routes.

Então, quem for usar cada um desses artefatos basta importar:

const module = require('./post'); // ta lendo o index.js dentro de app/post

// module.post 
// module.service
// module.routes

Pelo bridge você acessa de maneira elegante cada submodulo de post.

Pena não ter um projeto público para compartilhar essa estrutura com você. Mas é muito usada nas empresas, principalmente no mundo corporativo.

Sucesso e bom estudo!

OBS: dependendo do template render que você usar, pode importá-los com require, ai fica mais organizado ainda.

Mas só um detalhe. Você postou essa dúvida no curso de JavaScript avançado III. Nele eu não uso require, eu uso import do ES2015 :)

Muito legal essa solução Flávio, mas como voce disse, ela não resolve 100%.

Tendo um projeto como aquele do MEAN Stack (me corrija por favor!):

./app/api/user.js
./app/routes/user.js
./app/models/user.js
./config/express.js
./server.js

A gente teria que separar os arquivos por feature, nao por role:

./app/user/api.js
./app/user/route.js
./app/user/model.js
./app/user/index.js
./config/express.js
./server.js

mesmo assim, quando eu for importar esses caras, ficaria:

//De dentro da pasta config,  em express.js ficaria algo parecido com isso:
const user = require('../app/user')

certo?

Vi algumas outras coisas com symlink, mas não tenho certeza do quanto isso é usado.

Desculpa, eu marquei ela somente como javascript e ela acabou caindo aqui.

solução!

Sim, vai continuar com o .. nesse caso. O uso do bridge com submodulos ajuda a você ter um único ponto de importe dentro de um módulo, uma boa prática que tenho usado hoje. Mas se esse ponto precisa de ../../ ai não tem jeito.

Mas fiz questão de deixar registrada essa forma. Sucesso e bom estudo meu aluno. Aliás, se usar a bridge, você nem precisa usar consign nem express-load, mas vai escrever mais.

Obrigado Flavio! Padawan continuará na missão de aprendizado! kkk