Estou usando o npm para gerenciar jQuery, Bootstrap, Font Awesome e bibliotecas de cliente semelhantes de que preciso para meu aplicativo ASP.NET Core.
A abordagem que funcionou para mim começou adicionando um arquivo package.json ao projeto, que se parece com isto:
{
"version": "1.0.0",
"name": "myapp",
"private": true,
"devDependencies": {
},
"dependencies": {
"bootstrap": "^3.3.6",
"font-awesome": "^4.6.1",
"jquery": "^2.2.3"
}
}
O npm restaura esses pacotes na pasta node_modules que está no mesmo nível que wwwroot no diretório do projeto:
Como o ASP.NET Core fornece os arquivos estáticos da pasta wwwroot e node_modules não está lá, eu tive que fazer algumas alterações para fazer isso funcionar, a primeira: adicionar app.UseFileServer logo antes de app.UseStaticFiles em minha inicialização. arquivo cs:
app.UseFileServer(new FileServerOptions()
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")),
RequestPath = new PathString("/node_modules"),
EnableDirectoryBrowsing = true
});
app.UseStaticFiles();
e o segundo, incluindo node_modules em my publishOptions no arquivo project.json:
"publishOptions": {
"include": [
"web.config",
"wwwroot",
"Views",
"node_modules"
]
},
Isso funciona em meu ambiente de desenvolvimento e também funciona quando eu o implanto em minha instância do Azure App Service, os arquivos estáticos jquery, bootstrap e font-awesome são servidos bem, mas não tenho certeza sobre essa implementação.
Qual é a abordagem certa para fazer isso?
Esta solução veio depois de coletar muitas informações de várias fontes e tentar algumas que não funcionaram, e parece um pouco estranho ter que servir esses arquivos de fora do wwwroot.
Qualquer conselho será bem-vindo.
fonte
Bundler and Minifier
- Especifique a fonte como Outside wwwroot e quando você construí-lo constrói o JS em wwwroot. Essa é a maneira correta. Você não deve veicular conteúdo de node_modulesnode_modules
pasta estaticamente . a) não é assim que o ecossistema foi projetado b) é um risco de segurança, um de seus pacotes instalados pode vazar informações confidenciais. A maneira adequada é configurar um pipeline de construção (grunt / gulp / node / webpack) que publica arquivos em uma pastasrc
ouwhatever
dedicada a servir arquivos de front-end estáticosRespostas:
Ao publicar sua
node_modules
pasta inteira, você está implantando muito mais arquivos do que realmente precisa na produção.Em vez disso, use um executor de tarefa como parte de seu processo de construção para empacotar os arquivos de que você precisa e implantá-los em sua
wwwroot
pasta. Isso também permitirá que você concatene e reduza seus recursos ao mesmo tempo, em vez de ter que servir cada biblioteca individual separadamente.Você também pode remover completamente a
FileServer
configuração e confiarUseStaticFiles
nela.Atualmente, o gulp é o executor de tarefas do VS preferido. Adicione um
gulpfile.js
à raiz do seu projeto e configure-o para processar seus arquivos estáticos na publicação.Por exemplo, você pode adicionar a seguinte
scripts
seção ao seuproject.json
:Que funcionaria com o seguinte gulpfile (o padrão ao usar scaffolding
yo
):fonte
node_modules
porque é isso que o npm faz. A tarefa gulp é necessária para colocar as coisas no lugar certo, ou seja, onde você realmente precisa delas. Acho que o problema é que a Microsoft forneceu uma integração tão bonita com o Bower, mas agora o Bower está morto (ou pelo menos morrendo) e a Microsoft não forneceu nenhuma ferramenta alternativa.npm
para gerenciar bibliotecas do lado do cliente é uma boa escolha (ao contrário do Bower ou NuGet), você está pensando na direção certa :)FileServer
, masStaticFiles
deve ser suficiente para servir arquivos estáticos (.js, imagens etc.)wwwroot
parapublic
, caso contrário, a estrutura de pastas nos Aplicativos Web do Azure será confusa (D:\Home\site\wwwroot\wwwroot
vsD:\Home\site\wwwroot\public
)node_modules
para um servidor de hospedagem na web). Vejatools/deploy.js
como exemplo.Visite ASP.NET Core Starter Kit no GitHub (isenção de responsabilidade: eu sou o autor)
fonte
Instale o Bundler e o Minificador nas extensões do Visual Studio
Em seguida, você cria um
bundleconfig.json
e insere o seguinte, como:Portanto, o bundler e o minificador (baseado em gulp) têm acesso aos arquivos de origem (que devem ser excluídos do Visual Studio e também do GIT) e os coloca no wwwroot conforme especificado
apenas o efeito colateral toda vez que você salvá-lo irá executá-lo (mas você pode configurá-lo para executá-lo manualmente)
fonte
Eu te dou duas respostas. O npm combinado com outras ferramentas é poderoso, mas requer algum trabalho de configuração. Se você deseja apenas baixar algumas bibliotecas, pode usar o Library Manager (lançado no Visual Studio 15.8).
NPM (avançado)
Primeiro adicione o package.json na raiz do seu projeto. Adicione o seguinte conteúdo:
Isso fará com que o NPM baixe Bootstrap, JQuery e outras bibliotecas usadas em um novo projeto principal asp.net para uma pasta chamada node_modules. O próximo passo é copiar os arquivos para um local apropriado. Para fazer isso, usaremos o gulp, que também foi baixado pelo NPM. Em seguida, adicione um novo arquivo na raiz do seu projeto denominado gulpfile.js . Adicione o seguinte conteúdo:
Este arquivo contém um código JavaScript que é executado quando o projeto é construído e limpo. Ele irá copiar todos os arquivos necessários para lib2 ( não lib - você pode facilmente alterar isso ). Usei a mesma estrutura de um novo projeto, mas é fácil mudar os arquivos para um local diferente. Se você mover os arquivos, certifique-se de atualizar também _Layout.cshtml . Observe que todos os arquivos no diretório lib2 serão removidos quando o projeto for limpo.
Se você clicar com o botão direito do mouse em gulpfile.js , poderá selecionar Task Runner Explorer . A partir daqui, você pode executar o gulp manualmente para copiar ou limpar arquivos.
O Gulp também pode ser útil para outras tarefas, como reduzir arquivos JavaScript e CSS:
https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1
Gerenciador de biblioteca (simples)
Clique com o botão direito em seu projeto e selecione Gerenciar bibliotecas do lado do cliente . O arquivo libman.json agora está aberto. Neste arquivo, você especifica qual biblioteca e arquivos usar e onde devem ser armazenados localmente. Muito simples! O arquivo a seguir copia as bibliotecas padrão usadas ao criar um novo projeto ASP.NET Core 2.1:
Se você mover os arquivos, certifique-se de atualizar também _Layout.cshtml .
fonte
gulpfile.js
paragulp.task('default', function (done) {
e, em seguida, adicionar como uma última linha nessa função o seguinte:done();
Caso contrário, eu iria receber a mensagem de erroThe following tasks did not complete: Did you forget to signal async completion?
Em vez de tentar servir a pasta de módulos de nó, você também pode usar o Gulp para copiar o que você precisa para wwwroot.
https://docs.asp.net/en/latest/client-side/using-gulp.html
Isso pode ajudar também
Visual Studio 2015 ASP.NET 5, tarefa Gulp não copiando arquivos de node_modules
fonte
Existem várias abordagens "certas", você apenas precisa decidir qual delas atende melhor às suas necessidades. Parece que você está entendendo mal como usar
node_modules
...Se você está familiarizado com o NuGet, deve pensar no npm como sua contraparte do lado do cliente. Onde o
node_modules
diretório é como obin
diretório do NuGet . A ideia é que este diretório seja apenas um local comum para armazenar pacotes, na minha opinião é melhor pegar umdependency
nos pacotes que você precisa como fez nopackage.json
. Em seguida, use um executor de tarefas,Gulp
por exemplo, para copiar os arquivos que você precisa para owwwroot
local desejado .Eu escrevi uma postagem no blog sobre isso em janeiro que detalha npm , Gulp e um monte de outros detalhes que ainda são relevantes hoje. Além disso, alguém chamou a atenção para minha pergunta de SO que fiz e, no final das contas, me respondeu aqui , o que provavelmente é útil.
Criei um
Gist
que mostra ogulpfile.js
como exemplo.No seu
Startup.cs
ainda é importante usar arquivos estáticos:Isso garantirá que seu aplicativo possa acessar o que precisa.
fonte
Uma abordagem muito mais simples é usar o pacote OdeToCode.UseNodeModules Nuget. Acabei de testá-lo com .Net Core 3.0. Tudo que você precisa fazer é adicionar o pacote à solução e referenciá-lo no método Configure da classe Startup:
Aprendi sobre isso no excelente curso Construindo um aplicativo da Web com ASP.NET Core, MVC, Entity Framework Core, Bootstrap e Angular Pluralsight de Shawn Wildermuth.
fonte
Shawn Wildermuth tem um bom guia aqui: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower
O artigo está vinculado ao gulpfile no GitHub, onde ele implementou a estratégia do artigo. Você poderia simplesmente copiar e colar a maior parte do conteúdo do gulpfile no seu, mas certifique-se de adicionar os pacotes apropriados em package.json em devDependencies: gulp gulp-uglify gulp-concat rimraf merge-stream
fonte
Descobri uma maneira melhor de gerenciar pacotes JS em meu projeto com os executores de tarefas Gulp / Grunt do NPM. Não gosto da ideia de ter um NPM com outra camada de biblioteca javascript para lidar com a "automação", e meu requisito número um é simplesmente executar a atualização do npm sem nenhuma outra preocupação sobre se preciso executar gulp stuff, se copiou tudo com sucesso e vice-versa.
O jeito NPM:
O jeito python:
fonte
Por favor, desculpe a extensão desta postagem.
Este é um exemplo prático usando o ASP.NET Core versão 2.5.
Algo digno de nota é que o project.json está obsoleto ( veja aqui ) em favor do .csproj . Um problema com .csproj . arquivo é a grande quantidade de recursos e o fato de não haver um local central para sua documentação ( veja aqui ).
Mais uma coisa, este exemplo está executando o ASP.NET core em um contêiner Docker Linux (alpine 3.9); então os caminhos irão refletir isso. Ele também usa gulp ^ 4.0. No entanto, com algumas modificações, ele deve funcionar com versões mais antigas do ASP.NET Core, Gulp, NodeJS e também sem Docker.
Mas aqui está uma resposta:
gulpfile.js veja o verdadeiro exemplo de trabalho aqui
Adicione um destino no arquivo .csproj . Observe que também adicionamos um relógio para observar e excluir se aproveitarmos o
dotnet run watch
comando.app.csprod
Agora, quando
dotnet run build
for executado, ele também instalará e construirá módulos de nó.fonte