Skip to content

Instantly share code, notes, and snippets.

@igorlima
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igorlima/ade78873b125c9e2a17e to your computer and use it in GitHub Desktop.
Save igorlima/ade78873b125c9e2a17e to your computer and use it in GitHub Desktop.

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)

Documentação

O argumento length, que é mencionado mas não foi documentado na versão 10, foi removido.

process.maxTickDepth removido

process.maxTickDepth foi removido, permitindo que o método process.nextTick devore os I/O por tempo indeterminado.

o stream Writable emite o evento ‘finish’ na próxima escala caso haja um ‘write()’

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

VM

Módulos VM tem colididos de 'Instável' para 'Estável'.

vm.runInThisContext(code, [options])

Documentação

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.

vm.createContext([sandbox])

Documentação

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.

vm.isContext(sandbox)

Documentação

Retorna se um objeto sandbox foi ou não contextualizado pela chamada vm.createContext.

vm.runInContext(code, contextifiedSandbox, [options])

Documentação

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(code, [sandbox], [options])

Documentação

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.

vm.createScript(code, [filename])

Esse método foi depreciado (aparentemente sem aviso) e substituído por new vm.Script.

new vm.Script(code, options)

Documentação

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.

script.runInThisContext([options])

Documentação

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.

script.runInContext(contextifiedSandbox, [options])

Documentação

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.

script.runInNewContext([sandbox], [options])

Documentação

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.

E o que mais?

  • 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment