O thrust (ou thrustjs) é uma plataforma de execução/interpretação JavaScript, ou seja, é um Server-side JavaScript (SSJS). Ele permite a escrita de código em JavaScript a ser executado sobre a Java Virtual Machine (JVM). Desenvolvida pela Softbox, empresa inovadora na área de soluções em TI, a plataforma foi concebida visando, principalmente:
- Ser concisa e eficiente, com foco em alta performance;
- Ter, nativamente, poucas APIs, diminuindo assim drasticamente a curva de aprendizagem;
- Trabalhar fortemente o conceito de Definition Over Configuration, trazendo uma série de configurações padrões bem definidas, mas permitindo ao utilizador customiza-las à qualquer momento.
O thrust dispõe de um CLI que permite a inicialização de projetos com scaffolding, instalação de dependências e execução dos apps thrust.
A plataforma é completamente gratuita e disponibilizada para uso segundo as políticas de licenciamento MIT.
Bitcodes são equivalentes a um módulo em outras linguagens. Um bitcode é um namespace que agrupa funcionalidades afins. Um exemplo é o bitcode filesystem que possui várias funções ou API's que manipulam o sistema de arquivos do computador, como por exemplo leitura de arquivos, verificação da existência de um diretório ou arquivo etc.
O thrust já possui em sua versão inicial vários bitcodes que enriquecem a plataforma e auxiliam no desenvolvimento de soluções. Você pode ver cada um deles no nosso repositório oficial.
Você também pode criar os seus próprios bitcodes e utilizá-los em seus thrust apps.
1 - Realize o download do thrust e instale.
2 - O cli thrust agora estará disponível em seu terminal.
Agora, você poderá usar thrust init [/home/user/projects/thrust-test] para inicializar um novo app Thrust no diretório corrente ou no que foi passado como argumento.
Você pode passar uma opção para init chamada -t|-template, para iniciar o seu projeto com um seed específico, o padrão no caso em que a opção não é passada é thrust-seeds/web-complete.
Você também pode criar os seus próprios seeds e utilizá-los em seus thrust apps.
Em uma aplicação thrust disponibilizamos algumas funções e variáveis globais para utilização, vamos conhecer as principais delas:
/**
* Path base da aplicação que está rodando
* */
const rootPath:String
/**
* Usado para carregar um módulo, que pode ser um arquivo ou bitcode
* @param {String} fileName - Nome do recurso a ser carregado.
* Caso seja passado um caminho relativo (./ ou ../) o módulo será carregado
* com caminho relativo ao script que originou a chamada.
*
* Caso seja passado um caminho iniciando com '/', consideramos o require
* a partir do diretório root
*
* Caso seja passado um nome, assumimos que é um require de bitcode,
* sendo assim pesquisamos pelos bitcodes instalados.
* O require de bitcodes, é feito com 'owner/bitcode', sendo que owner
* é opcional e caso não informado será carregado um bitcode oficial,
* 'thrust-bitcodes/bitcode'
*
* O algoritmo de require sempre pesquisa por 'NomeDoModulo/index.js'
* ou 'NomeDoModulo.js', nesta ordem.
*
* @returns {Object} Retorna o modulo carregado
* @code require('database')
* @code require('ownerNaoOficial/database')
* @code require('./teste')
*/
function require(fileName)
/**
* Usado para carregar um jar para o Classpath da aplicação.
* @param {String} jarName - Nome do jar a ser carregado.
* Caso seja passado um caminho relativo (./ ou ../) o módulo será carregado
* com caminho relativo ao script que originou a chamada.
*
* Caso seja passado um nome, assumimos que é um require de dependencia de um bitcode,
* sendo assim pesquisamos pelos jars dos bitcodes instalados.
*
* @code loadJar('./vendor/meuJar.jar')
*/
function loadJar(jarName)
/**
* Usado para carregar um objeto para o contexto global
* @param {String} name - Nome que será colocado no contexto global.
* @param {String} name - Objeto que será colocado no contexto global.
*
* @code dangerouslyLoadToGlobal('db', {teste: 1})
* @code print(db.teste) //Saída: 1
*/
function dangerouslyLoadToGlobal(name, obj)
/**
* Usado para pegar o JSON de configuração (config.json)
* @code getConfig().minhaVar
*/
function getConfig()
/**
* Usado para pegar um getter de configuração
* O getter tem a assinatura (property:String,appId:String).
* É possível passar como 'property' um path do JSON, que
* irá navegar no mesmo e buscar uma configuração.
*
* Caso seja passado um appId como parâmetro, então
* o getter tentará buscar uma configuração com 'property'
* e adicionará o appId como ultimo parâmetro para tentar
* achar uma configuração específica deste app, se não encontrar,
* retorna apenas o valor do 'property', que representa o global
* para todas as possíveis aplicações.
*
*
* @returns {function} Usado para pegar configurações
*
* @code let dbConfig = getBitcodeConfig('database')
* @code dbConfig('path.de.uma.config')
* @code dbConfig('path.de.uma.config', 'MeuApp')
*/
function getBitcodeConfig(bitcode)
/**
* Usado para ler uma variável de ambiente do SO.
* Se não informado nenhum parametro, é retornado um objeto com todas as variáveis.
* @param {String} name - Nome da variável.
* @param {Object} defaultValue - Opcional, valor default que será utilizado caso a variável seja nula.
*
* @code env('PORT', 8778)
*/
function env(name, defaultValue)As propriedades abaixo devem ser configuradas no arquivo config.json (distribuído juntamente com o ThrustJS):
/* Os valores abaixo representam os valores default*/
{
"loadToGlobal": [], /*String/Array Bitcodes que devem ser carregados globalmente*/
"cacheScript": false, /*Liga ou desliga o cache de require*/
}Atualmente, o debug de aplicações não funciona com a GraalVM.
Para realizar o debug do thrust siga os seguintes passos:
1 -Baixe o seguinte projeto, extraria e o coloque sua pasta bin no path de seu SO: NCDbg
2 - No Visual Studio Code, instale a extensão Debugger for Chrome e reinicie o mesmo.
3 - Adicione o arquivo de configuração de execução do VSCode, em .vscode/launch.json. (Copie o deste repositório)
4 - Coloque as instruções de debugger; em seu código.
5 - Inicie sua aplicação com thrust arquivo.js --debug
6 - A execução ficará aguardando conexão do debug para prosseguir, então na aba Debug do VSCode, inicie a execução de Attach to NCDbg
A partir da versão 0.6.0 o thrust dá suporte a utilização da GraalVM.
Utilizando a GraalVM, o interpretador deixa de ser o Nashorn e passa a ser o GraalJS, que é compatível com ES8.
Existem algumas quebras de API entre um interpretador e outro,
o migration guide, disponibilizado pelo próprio GraalJS está disponível em NashornMigrationGuide.md
Para utilização da GrallVM você pode chamar o thrust passando o parâmetro --graal ou ter uma variável de ambiente chamada USE_THRUST_GRAAL setada como true.
Exemplos:
export USE_THRUST_GRAAL=true #você pode setar esta linha em seu ~/.bashrc
thrust teste.jsthrust teste.js --graalObservações:
- Atualmente, o debug de aplicações não funciona com a
GraalVM. - No futuro, o GraalJS será o interpretador padrão do thrust.
v0.5.3
- Adição do método addInterceptor ao require, para que seja possível interceptar o load do código
v0.5.2
- Ajuste no CLI de init que impedia a inicialização de uma nova aplicação thrust
v0.5.1
- Criado novo comando "upgrade" no CLI, que realiza a atualização do thrust para uma versão específica.
Ex:
thrust upgrade //Baixará o thrust que está na master.
thrust upgrade 0.5.1 //Baixará a tag 0.5.1 to thrust
Obs:
- O comando precisa de privilégios para atualizar a pasta de instalação, portanto, rode como administrador ou com
sudo. - Só é possível alterar para versões 0.5.1 e acima.
v0.5.0
- Alteramos o core do thrust para que o mesmo seja executado diretamente pelo jjs, agora contamos um código 100% Javascript.
- Diversas melhorias no sistema de CLI, incluindo help geral e de todos os comandos.
- Inclusão do modo debug, vide README para mais detalhes.
- Incorporado bitcode 'fs' dentro do core, agora não é necessário instalar a dependência 'filesystem'.
- Novo método env, para carga de configurações do environment, argumentos da linha de comando e config.json
- Diversas melhorias no sistema de require
- Função de monitoria nos retornos do require
Quebras de API
- Função
loadToGlobalteve seu nome alterado paradangerouslyLoadToGlobal. - Função require agora lança exceção caso o arquivo solicitado não seja encontrado.
- Função readJson foi movida para o bitcode 'fs', que está embarcado no thrust.
getConfig()antes retornava um objeto que podia ser modificado, agora, modificar este objeto lancará um erro.
v0.4.0
- Feature: Versionamento de bitcodes Agora é possível versionar os seus bitcodes instalados, você pode instalar novamente informando a versão ou modificar diretamente em seu brief.json e rodando o install novamente.
Ex:
thrust install [email protected] //Baixará a tag 0.1.8 do repositório do http
thrust install http //Baixará a master do repositório do http, visando retrocompatibilidade
O brief.json sempre é atualizado com a versão que está sendo instalada, caso já houvesse um "http" ele seria trocado por "[email protected]", caso esteja sendo instalado sem versão, a versão será removida do brief.
v.0.3.0 Nesta versão alteramos a maneira em que o thrust realiza os downloads de seed e bitcodes GitHub, antes baixavamos arquivo por arquivo com o intuito de ser mais simples e rápido, porém isso fazia com que o github limitasse a quantidade de downloads por hora. Agora baixamos o zip completo e extraimos o que precisamos para execução, não tendo mais problemas com limites.
v.0.2.0
- Release inicial do thrust
Visite também o nosso GitBook para uma documentação completa do thrust.