Nota do editor: Bem-vindo à segunda parte de uma série de três, que visa ajudá-lo a ter um empurrãozinho nas novidades e quebras de APIs do Node v0.12. Na primeira parte, Alex Gorbatchev extraiu as APIs que não vão quebrar. Já na segunda parte, ele separou as que irão. E na terceira, Ben Noordhuis mostra detalhes nas mudanças da API C++.
Pelo fato da versão v0.12 não estar pronta ainda, este post é, em grande parte, baseado em diferenças entre a documentação da versão 0.10 e v0.11. Clique em uma API abaixo para ir na seção apropriada para saber mais.
- rl.setPrompt(prompt)
- process.maxTickDepth removed
- Writable stream emits ‘finish’ on next tick if there was a ‘write()’
- VM
- vm.runInThisContext(code, [options])
- vm.createContext([sandbox])
- vm.isContext(sandbox)
- vm.runInContext(code, contextifiedSandbox, [options])
- vm.runInNewContext(code, [sandbox], [options])
- vm.createScript(code, [filename])
- new vm.Script(code, options)
- script.runInThisContext([options])
- script.runInContext(contextifiedSandbox, [options])
- script.runInNewContext([sandbox], [options])
O argumento length
, que é mencionado mas não foi documentado na versão 10, foi removido.
process.maxTickDepth
foi removido, permitindo que o método process.nextTick
devore os I/O por tempo indeterminado.
Na versão v0.10, os callbacks para write()
e end()
podem ser chamados após o evento finish
ser emitido. A versão v0.12 está emitindo o evento finish
, mas este evento fica esperando até a próxima escala (tick), desde que uma operação de write()
ainda esteja potencialmente como pendente.
Exemplo:
var stream = require('stream');
var util = require('util');
var Peek = function () {
stream.Writable.call(this);
};
util.inherits(Peek, stream.Writable);
Peek.prototype._write = function (chunk, encoding, callback) {
callback();
};
var preview = new Peek();
preview.on('finish', function () {
console.log('finish');
});
preview.write('some text', 'utf-8', function(er) {
console.log('write');
});
preview.end(function() {
console.log('end');
});
console.log('end of tick');
Executando este exemplo na versão v0.10 e v0.12 produz a seguinte saída:
$ node-v0.10/bin/node test.js
finish
end of tick
write
end
$ node-v0.12/bin/node test.js
end of tick
write
finish
end
Módulos VM tem colididos de 'Instável' para 'Estável'.
vm.runInThisContext()
compila o argumento code
, executa-o e retorna o resultado. A execução do código não tem acesso ao escopo local, mas tem acesso ao objeto global
corrente.
Exemplo de uso com vm.runInThisContext
e eval para executar o mesmo código:
var localVar = 'initial value';
var vmResult = vm.runInThisContext('localVar = "vm";');
console.log('vmResult: ', vmResult);
console.log('localVar: ', localVar);
var evalResult = eval('localVar = "eval";');
console.log('evalResult: ', evalResult);
console.log('localVar: ', localVar);
// vmResult: 'vm', localVar: 'initial value'
// evalResult: 'eval', localVar: 'eval'
vm.runInThisContext
não tem acesso ao escopo local, portanto o localVar
é inalterado. Já o eval
têm acesso ao escopo local e o localVar é alterado.
Desta forma o método vm.runInThisContext
é muito parecido com uma chamada indireta de eval, por exemplo, (0,eval)(‘code’)
. No entanto, este método também tem as seguintes opções adicionais:
- filename – permite controlar o nome do arquivo que aparece em qualquer rastreamento de pilha produzido.
- displayErrors – imprime qualquer erro em stderr, com a linha de código que gerou o erro em destaque, antes de lançar uma exceção. Vai capturar os erros de compilação e os erros runtime gerados ao executar o código compilado. O padrão é true.
- timeout – um número em milésimo de segundos para executar o código antes do término da execução. Caso a execução seja interrompida, um erro será gerado.
Caso um objeto sandbox
seja dado, então será criado um contexto com essa sandbox para que possa ser usado em chamadas de vm.runInContext
ou script.runInContext
. Os scripts internos são executados como se o sandbox
fosse o objeto global, mantendo todas as suas propriedades existentes, mas também tendo os objetos internos e funções que qualquer objeto global padrão tem. Os scripts externos são executados pelo módulo de vm e a sandbox
não será alterada.
Se não receber um objeto sandbox, retorna um objeto novo, que é um objeto sandbox vazio contextualizado.
Esta função é útil para criar uma sandbox que possa ser usada para executar vários scripts, como por exemplo, a emulação de um navegador web, que pode ser utilizado para criar um sandbox único que represente o objeto global da janela, e que execute todas as tags de <script>
dentro dessa sandbox.
Retorna se um objeto sandbox foi ou não contextualizado pela chamada vm.createContext
.
vm.runInContext
compila o argumento code
, executa-o em um contexto de sandbox (contextifiedSandbox) e retorna o resultado. A execução do código não tem acesso ao escopo local. O objeto contextifiedSandbox
deve ser previamente contextualizado através do método vm.createContext
, e ser usado como o objeto global para o código.
vm.runInContext
tem as mesmas opções que vm.runInThisContext
.
vm.runInNewContext
compila o argumento code
, contextualiza a sandbox caso seja especificada alguma ou cria uma nova contextualizada, e em seguida executa o código com a sandbox como um objeto global e retorna o resultado.
vm.runInNewContext
tem as mesmas opções que vm.runInThisContext
.
Observe que a execução de um código não confiável é um negócio complicado e requer muito cuidado. vm.runInNewContext
é bastante útil, mas para a execução com segurança de um código não confiável requer um processo separado.
Esse método foi depreciado (aparentemente sem aviso) e substituído por new vm.Script
.
A criação de um novo Script
compila o código mas não o executa. Em vez disso, o objeto criado representa o código compilado. Este script pode ser executado mais tarde várias vezes usando os métodos abaixo. O script retornado não é vinculado a qualquer objeto global. Há uma vinculação a um objeto global antes de cada execução, apenas para o script seja executado.
As opções ao criar um script são:
- filename – permite controlar o nome do arquivo que aparece em qualquer rastreamento de pilha produzido.
- displayErrors – imprime qualquer erro em stderr, com a linha de código destacada que gerou o erro, antes de lançar uma exceção. Aplica-se somente aos erros de compilação; erros durante a execução do código são controlados pelas opções de métodos de script.
Semelhante ao método vm.runInThisContext
, mas um método de um objeto pré-compilado de Script
. O método script.runInThisContext
executa o código compilado do script e retorna o resultado. A execução do código não tem acesso ao escopo local, mas tem acesso ao objeto global corrente.
As opções para a execução de um script são:
- displayErrors – imprime qualquer erro em stderr, com a linha de código que gerou o erro em destaque, antes de lançar uma exceção. Aplica-se somente a erros runtime gerados ao executar o código compilado. É possível criar uma instância com a sintaxe de erros, como se o construtor fosse lançar uma exceção.
- timeout – um número em milésimo de segundos para executar o script antes do término da execução. Caso a execução seja interrompida, um erro será lançado.
Semelhante ao método vm.runInContext
, mas um método de um objeto pré-compilado de Script. O método script.runInContext
executa o código compilado do script em uma sandbox contextualizada e retorna o resultado. A executando do código não tem acesso ao escopo local.
script.runInContext
tem as mesmas opções que script.runInThisContext
.
Semelhante ao método vm.runInNewContext
, mas um método de um objeto pré-compilado de Script
. O método script.runInNewContext
contextualiza a sandbox
ou cria uma nova sandbox contextualizada caso não seja especificada, e em seguida executa o código compilado utilizando a sandbox como objeto global e retorna o resultado. A execução do código não tem acesso ao escopo local.
script.runInNewContext
tem as mesmas opções que script.runInThisContext
.
- Cadastre-se na Newsletter da StrongLoop e nunca perca outro artigo técnico sobre NodeJS.
- O que tem no lançamento do Node v0.12? Pelo menos oito novas funcionalidades. Verifique em nossa página “What’s New in Node.js v0.12” para saber mais.
- Pronto para desenvolver APIs e deixá-las conectadas aos seus dados? Confira o framework LoopBack. E veja como que fica mais fácil começar uma API tanto localmente quanto na nuvem, simplesmente com um npm install.
- Precisa de treinamento e certificação em Node? Saiba mais sobre ambos com as opções de ofertas da StrongLoop.