Um kit de ferramentas modular para construir sites estáticos
Stakit é uma estrutura que ajuda você a compor pipelines de construção poderosos para sites estáticos sem suar a camisa. É mínimo e modular, usa streams e o kit de ferramentas Stakit possui vários plug-ins e transformações que você pode usar.
Stakit ainda está no início do desenvolvimento, mas você pode pegá-lo e usá-lo para ver se deve se preocupar com ele ou não.
agnóstico de framework : funciona com qualquer framework que possa gerar uma string
modular : você nunca tem o que não precisa, mas pode npm install
API pequena : possui apenas 7 métodos principais, apenas 3 deles você deve usar
sem restrições : você nunca fica limitado pelos recursos e modelos de um gerador de site estático
rápido, com uso eficiente de memória : uso intenso de streams
npm i stakit
var stakit = require('stakit')var { renderizar, hidratar } = require('stakit-choo')var app = require('.')var kit = stakit() .routes (função (estado) {retorno [ '/'] }) .render(renderizar(aplicativo)) .transform(hidrato)kit.output(stakit.writeFiles('./public'))
Geralmente, você faz duas coisas ao gerar um site estático:
preencha seu aplicativo com algum conteúdo
copiar arquivos estáticos
Existem muitas ferramentas modulares (e adoráveis) para agrupar Javascript ou transformar CSS, Stakit é algo semelhante, mas para o site completo, e se concentra especialmente em arquivos HTML.
Você terá que lidar com o pacote do seu aplicativo e incluí-lo, se for necessário. Seguindo a filosofia de Choo, é pequeno, compreensível e fácil de usar. Ele foi projetado para funcionar principalmente com Choo, mas também deve funcionar com outras estruturas isomórficas.
Stakit é chamado programaticamente, não a partir da linha de comando, portanto você precisará de um arquivo Javascript (como build.js
), onde for necessário. Depois você pode inicializar o kit com stakit()
e então encadear alguns métodos.
Dois métodos devem aparecer no pipeline:
routes(fn)
render(fn)
Todos os outros métodos são opcionais e chamados na seguinte ordem:
todos os middlewares aplicados por kit.use()
a função routesReducer
aplicada
para cada rota:
uma única chamada para o renderer
aplicado
todas as chamadas transform
Finalize o pipeline com kit.output()
.
Esta seção fornece documentação sobre como cada função do Stakit funciona. Pretende ser uma referência técnica.
kit = stakit()
Inicialize uma nova instância kit
.
kit.html(template, selector)
Define o modelo HTML inicial e o seletor.
kit.use(fn(context))
Envia um middleware/plugin para a lista de middlewares, funções de uso geral executadas antes da geração da rota. Você pode modificar o contexto da maneira que desejar, desde alterar o state
até instalar transform
s.
kit.use(função(ctx){ ctx._transforms.push(transformar)})
Consulte Middlewares para obter mais informações.
kit.routes(routeReducer(state))
O routeReducer
é uma função que recebe context.state
como parâmetro e retorna um Array
de strings/rotas. Estas são as rotas nas quais o Stakit chamará render
.
kit.routes(função (estado) { retornar Object.keys (estado.content) //ou estaticamente return [ '/', '/sobre', '/blog' ]})
kit.render(renderer(route, state))
Define o renderizador da construção. É aqui que a mágica acontece. O renderer
será chamado para cada rota retornada por routes
.
Deve retornar um objeto com os seguintes valores:
{ html: string, // o resultado da renderização state: object // o estado após a renderização (opcional)}
As transformações receberão o estado atualizado retornado aqui.
kit.transform(transformFn, opts)
Envia uma transformação para a lista de transformações. Stakit usa documentify
e streams para construir o HTML.
Eles são chamados depois que o conteúdo renderizado é substituído no HTML.
Consulte Transformações para obter mais informações.
kit.output(writerObject)
Inicia o pipeline de construção e termina passando todas as rotas para writerObject.write({ destination, stream })
. Retorna uma Promise
que espera até que todos os arquivos (rotas e estáticos) tenham sido completamente gravados.
Por padrão, ele usa um gravador que envia o site para o diretório ./public
.
Consulte Escritores para obter mais informações.
Middlewares integrados:
stakit.state(extendState)
Utilitário para ajudá-lo a adicionar valores a context.state
kit.use(stakit.state({ mensagem: 'bom dia!' }))
stakit.copy(files)
Middleware para copiar arquivos para o diretório de saída.
// Copie os arquivos para o mesmo localkit.use(stakit.copy([ 'robots.txt' ]))// Copie os arquivos para um local diferente na saída pathkit.use(stakit.copy({ 'robôs.txt': 'robôs.txt', 'sitemap.xml': 'sitemaps/sitemap.xml'}))
Documentify
é muito poderoso e pode ser facilmente modulado. O formato geral de uma transformação Stakit é:
//envolvido em uma funçãofunction lang (context) { // retorna a transformação documentify função de retorno (lang) {// retorna uma transformação streamreturn hstream({ html: { lang: lang } }) }}
Nota: hstream
é um bom amigo!
A transformação documentify
é envolvida em uma função, para que possamos obter o context
quando precisarmos, sem mexer na API do documentify
. Se quiser ignorar isso, você pode simplesmente retornar a transformação documentify
de uma função.
Veja quais transformações vêm com o Stakit em transforms/readme.md
.
Os gravadores geram os arquivos estáticos gerados e transformados. Isso pode variar desde a saída para o sistema de arquivos até colocá-los em um arquivo Dat.
Um escritor deve implementar um método: write
. Para cada arquivo, incluindo as páginas geradas + os arquivos adicionados a context._files
, writer.write
será chamado com um objeto de arquivo. Ele deve retornar uma Promise
que retorna após o pipe ser liberado (o arquivo foi completamente gravado).
Um objeto de arquivo se parece com isto:
{ source: null | string, destination: string, stream: Stream }
É recomendado limpar o diretório de saída antes de cada compilação.
Dê uma olhada no método stakit.writeFiles
integrado como exemplo.
Isso é tudo sobre escritores.
choo - estrutura de front-end robusta de 4kb
documentify - Empacotador HTML modular
jalla - Compilador web extremamente rápido e servidor em um (também obrigado por muitos trechos de código!)