Tenho uma pergunta sobre as melhores práticas para inclusão node_modules
em um site HTML.
Imagine que eu tenho o Bootstrap dentro da minha node_modules
pasta. Agora, para a versão de produção do site, como incluiria o script Bootstrap e os arquivos CSS localizados dentro da node_modules
pasta? Faz sentido deixar o Bootstrap dentro dessa pasta e fazer algo como o seguinte?
<script src="./node_modules/bootstrap/dist/bootstrap.min.js"></script>
Ou eu teria que adicionar regras ao meu arquivo gulp que copiasse esses arquivos na minha pasta dist? Ou seria melhor deixar o gulp de alguma forma remover completamente o bootstrap local do meu arquivo HTML e substituí-lo pela versão CDN?
Respostas:
Normalmente, você não deseja expor nenhum dos seus caminhos internos para saber como o servidor está estruturado para o mundo externo. O que você pode é criar uma
/scripts
rota estática em seu servidor que busca seus arquivos em qualquer diretório em que residam. Portanto, se seus arquivos estiverem"./node_modules/bootstrap/dist/"
. Em seguida, a tag de script em suas páginas fica assim:Se você estava usando express com nodejs, uma rota estática é tão simples quanto isto:
Em seguida, todas as solicitações de navegador
/scripts/xxx.js
serão buscadas automaticamente no seudist
diretório em__dirname + /node_modules/bootstrap/dist/xxx.js
.Nota: As versões mais recentes do NPM colocam mais coisas no nível superior, não aninhadas tão profundamente; portanto, se você estiver usando uma versão mais recente do NPM, os nomes dos caminhos serão diferentes dos indicados na pergunta do OP e na resposta atual. Mas, o conceito ainda é o mesmo. Você descobrir onde os arquivos estão localizados fisicamente na sua unidade de servidor e você faz um
app.use()
comexpress.static()
para fazer um pseudo-caminho para esses arquivos para que você não está expondo a organização do sistema de arquivos do servidor real para o cliente.Se você não deseja criar uma rota estática como essa, provavelmente é melhor copiar os scripts públicos para um caminho que o servidor da Web trate como
/scripts
ou qualquer outra designação de nível superior que você deseja usar. Geralmente, você pode fazer essa cópia parte do seu processo de criação / implantação.Se você deseja tornar público apenas um arquivo em particular em um diretório e nem tudo o que é encontrado nesse diretório, pode criar manualmente rotas individuais para cada arquivo, em vez de usar
express.static()
como:E o código para criar uma rota para isso
Ou, se você ainda deseja delinear rotas para scripts
/scripts
, faça o seguinte:E o código para criar uma rota para isso
fonte
/scripts
porque dessa maneira todas as dependências dentro do módulo seriam mantidas.express.static()
envia a primeira correspondência encontrada. Como cadaexpress.static()
instrução cria apenas um caminho correspondente possível, não deve haver duplicatas de umaexpress.static()
instrução. Se você tiver váriasexpress.static()
instruções de que cada uma pode ter uma correspondência, a primeira no seu código será aquela cuja correspondência será usada. Além disso, você realmente não deve ter vários arquivos com o mesmo nome e caminho relativo alcançáveis porexpress.static()
instruções. A melhor prática é não fazer isso.express.static()
para um diretório que SOMENTE contenha arquivos públicos (incluindo subdiretórios). Portanto, não consigo imaginar um projeto em que muitosdist
diretórios fossem publicados. Isso me parece muito incomum. Talvez você queira fazer uma rota específica para um arquivo específico ou para 2-3 arquivos. Nesse caso, você é responsável por desambiguar esses arquivos. De qualquer forma, não é bom ter quatroscript.js
arquivos./script.js
solicitado pelo navegador. Portanto, a resposta abstrata é que você não deve permitir a existência de nomes de arquivos duplicados porque não é um problema solucionável, a menos que você precise de um prefixo exclusivo para cada diretório de arquivos. Em seguida, nomes raiz duplicados não são um problema de qualquer maneira. Para uma resposta mais específica com uma recomendação detalhada, você precisará postar sua própria pergunta com detalhes exatos.Eu usaria o módulo path npm e, em seguida, faria algo assim:
IMPORTANTE: usamos path.join para fazer a junção de caminhos usando a maneira independente do sistema, ou seja, no Windows e no Unix, temos diferentes separadores de caminho (/ e)
fonte
Como mencionado por jfriend00, você não deve expor sua estrutura de servidor. Você pode copiar os arquivos de dependência do projeto para algo como
public/scripts
. Você pode fazer isso muito facilmente com o dep-linker como este:fonte
src
s serão então algo como/scripts/[package-name]/dist/file.min.js
.Se você deseja uma solução rápida e fácil (e você tem o gulp instalado).
No meu,
gulpfile.js
eu executo uma tarefa simples de copiar e colar que coloca todos os arquivos que eu possa precisar no./public/modules/
diretórioA desvantagem disso é que não é automatizado. No entanto, se tudo o que você precisa é de alguns scripts e estilos copiados (e mantidos em uma lista), isso deve funcionar.
fonte
'scripts': {'install':'yarn gulp copy-modules'}
, assumindo que o yarn é o gerenciador de pacotes e o gulp está instalado no pacote.O diretório 'node_modules' pode não estar no diretório atual, portanto, você deve resolver o caminho dinamicamente.
fonte
Quero atualizar esta pergunta com uma solução mais fácil. Crie um link simbólico para node_modules.
A maneira mais fácil de conceder acesso público ao node_modules é criar um link simbólico apontando para o node_modules de dentro do diretório público. O link simbólico fará com que os arquivos existam onde quer que o link seja criado.
Por exemplo, se o servidor do nó tiver código para veicular arquivos estáticos
e __dirname refere-se a / path / to / app para que seus arquivos estáticos sejam servidos em / path / to / app / dist
e node_modules estiver em / path / to / app / node_modules, crie um link simbólico como este no mac / linux:
ou assim no windows:
Agora, um pedido de obtenção para:
receberá uma resposta com o arquivo em
que é realmente o arquivo em
Se seu diretório em / path / to / app / dist não for um local seguro, talvez por causa da interferência de um processo de compilação com gulp ou grunt, você poderá adicionar um diretório separado para o link e adicionar uma nova chamada serveStatic, como:
e no nó adicione:
fonte
Não encontrei nenhuma solução limpa (não quero expor a fonte de todos os meus node_modules), então acabei de escrever um script do Powershell para copiá-las:
fonte
Fiz as alterações abaixo para incluir automaticamente os arquivos no índice html. Para que quando você adicionar um arquivo à pasta, ele será automaticamente retirado da pasta, sem que você precise incluir o arquivo em index.html
fonte
Isto é o que eu configurei no meu
express
servidor:Boa sorte...
fonte