NodeJS创始人: Nodejs 编程的未来

NodeJS创始人: Nodejs 编程的未来

Isaac Schlueter 8月14 最近有关node.js核心API有很多的争论,观点和请求;我这里基于以下几点,对这个项目的技术做一下澄清:

回调依然是实现异步的默认方式;Generators 和 Promises 的模式非常有意义,但不会设成默认;

Streams流会更持久,更快,和完全向下兼容。兼容模式(或老模式)的API更干净,你可以“暂停”流,然后再次安全地读取;我们会不断公布对流扩展的细节;

Domains会被重构以便支持更通用的持续追踪系统,或者由用户启动可选的错误处理机制;虽然他可以由用户来定制,但会一直放在Node的默认安装包里;

一个稳定的C API slime已经被添加, 以便用户编写出稳定的扩展插件;因为V8的API在0.12有重大改变,因此所以的可执行插件都不能工作了,而且绑定合适版本的openssl/zlib/c-ares/等等非常困难,我们正在处理

module(模块)系统不会被改变,所以功能已经完成一年,以后只会修改那些肯定会重现的BUG;

TypeScript和CoffeeScript不会被加入核心库,但因为模块系统已经不会变更,现在支持的以后也会一直支持;

因为一些新语言特性已经加入V8,在Node中他们会按自己的方式工作,我们没有关闭、开启的标志;请自己尝试你的代码,如果不支持会弹出错误信任;

VM模块已经被重写,以便将"contextify"模块放入核心库;这样"上下文"将会向大家希望的那样工作,VM模块已经添加了多文档的支持;

同步子线程机制最终被添加;

v0.12版本已经基本完成;一旦我们开发完了,我们会发布;v0.12版本之后,我们会不会添加新的API,我们将会关注性能提升,修BUG还有提高稳定性;

我们在node.js上做了重大改动。如果你的程序现在可以工作,我们将尽一切可能确保它能继续工作,而且最快,最靠谱;

这并不民主,但是这里有足够的空间去容纳不同意见,如果你有另人惊喜的,对node核心库的重大改进,并且你发现你的意见并不会被采纳,那么就请Fork joyent/node 项目,创建一个新的分支和图标,做你任何你想做的事情吧。

http://ourjs.com/detail/5226bceb583e062803000007


27 回复

NodeJS创始人: Nodejs 编程的未来

Isaac Schlueter 8月14日

最近有关Node.js核心API有许多讨论、观点和请求。基于以下几点,我对这个项目的技术方向做一些澄清:

回调依然是默认方式

回调仍然是实现异步操作的主要方式。虽然Generators和Promises也很有意义,但它们不会成为默认选项。

// 示例代码:使用回调实现异步读文件
const fs = require('fs');
fs.readFile('./example.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

Streams流会更持久、更快

Streams流将会更加稳定、快速,并保持向下兼容。老模式的API更简洁,允许你“暂停”流并重新读取数据。

// 示例代码:使用Readable流
const { Readable } = require('stream');
const readableStream = new Readable({
    read() {}
});

readableStream.push('Hello ');
readableStream.push('World!');
readableStream.push(null); // 结束信号

readableStream.on('data', (chunk) => {
    console.log(chunk.toString());
});

Domains重构

Domains将会被重构以支持更通用的持续追踪系统,或者通过用户启动可选的错误处理机制。尽管用户可以自定义,但它将始终作为Node的核心组件。

// 示例代码:使用domains进行错误处理
const domain = require('domain');

const d = domain.create();
d.on('error', (err) => {
    console.error('Caught error:', err);
});

d.run(() => {
    // 这里的代码块将运行在一个独立的域中
    setTimeout(() => {
        throw new Error('Oops!');
    }, 1000);
});

稳定的C API

一个稳定的C API已经被添加,以便用户编写稳定的扩展插件。由于V8的API在0.12版中有重大更改,所有需要绑定特定版本的openssl/zlib/c-ares等库变得困难,我们正在解决这个问题。

模块系统保持不变

模块系统不会被改变。已经完成的功能将继续保持,只修复肯定会出现的bug。

// 示例代码:引入模块
const myModule = require('./myModule');
console.log(myModule.someFunction());

TypeScript和CoffeeScript不加入核心

TypeScript和CoffeeScript不会加入Node.js的核心库,但模块系统保持不变,目前支持的将来也会继续支持。

新语言特性

由于一些新的语言特性已经被加入到V8中,它们会在Node.js中按自己的方式工作,没有开关选项。请自行测试代码,如果遇到不支持的情况,会抛出错误。

// 示例代码:使用async/await(需要环境支持)
async function fetchData() {
    const response = await fetch('https://api.example.com/data');
    return response.json();
}
fetchData().then(data => console.log(data));

VM模块重写

VM模块已被重写,以便将contextify模块纳入核心库。这样,上下文将像期望的那样工作,同时VM模块增加了对多文档的支持。

// 示例代码:使用VM模块
const vm = require('vm');
const script = new vm.Script('var a = 1; var b = 2; a + b;');
const context = { a: 1, b: 2 };
const result = script.runInNewContext(context);
console.log(result); // 输出 3

同步子线程机制

同步子线程机制最终被添加。

// 示例代码:使用Worker进行多线程处理
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
    const worker = new Worker(__filename);
    worker.postMessage('Hello Worker!');
    worker.on('message', message => {
        console.log(message); // 输出 "Hello Main!"
    });
} else {
    parentPort.on('message', message => {
        parentPort.postMessage(`Hello ${message}!`);
    });
}

v0.12版本更新

v0.12版本已经基本完成。一旦我们开发完成,我们会发布。v0.12之后,我们将会关注性能提升、bug修复以及稳定性提高。

兼容性保证

我们做了许多重大改动。如果你的应用程序现在可以正常工作,我们将尽一切努力确保它在未来的版本中也能正常工作。

社区参与

这并不是一个民主的过程,但有足够的空间容纳不同的意见。如果你有一个对Node核心库的重大改进,并发现你的意见没有被采纳,那么请fork joyent/node项目,创建一个新的分支和图标,做你想要做的事。

希望这些澄清能帮助你更好地理解Node.js的发展方向。


Isaac是有多恨coffee啊

coffee 不行 , JS才是王道,这里有很多原因存在。

能否详细解释一下?

谁能解释一下啊?各种看不懂。

你應該誤會Isaac了 並不是討厭coffee,而是指這類的模組並不適合放進node.js的核心模組之中 他在不少研討會的場子上都有提到node.js的設計理念 核心維持精簡、只專注在最重要的需求,而不是一窩蜂的加功能,然後搭配npm蓬勃的生態圈

像TypeScript or CoffeeScript都只是JS Transcompiles 現階段並沒有重要的一定得放到核心不可 愛用者也可以透過npm install就裝來用,也不會有什麼不方便吧 ;p

js本身是很优雅很性感的,用了coffee,感觉戴套一样

同感~

没踩过坑的人都这么说

Isaac不是node的创始人, 是npm的开发者, nodejs现在的维护者.

实际控制人 ryan基本甩手掌柜了

同步子线程是啥?

coffee 的弱点让 TJ 大神已经阐述过了,是个SEX戴套的感觉。

还有个原因是交流费劲,JS作者也倡议共同JS编码,便于交流。

可以自己 fork 一个,然后增加内置coffee的node版本,让大家用,我相信你。

coffee就是个语法糖,其实学习成本还是不算高的,而且代码也不见得易读。。网上看源码,只要看到coffee的就直接x了··

C 不行, 汇编才是王道, 同样有很多原因在…

应该是child_process 支持Sync方式了吧……

缩进的写小段程序好看,程序逻辑多了,业务复杂了,有更新的时候就麻烦了

混着看两种“语言”很不舒服,团队作事,用起来很麻烦。

next2 ->应该写成next2 = ->

next() 中的 next在哪声明的?

漏了,sorry。编辑器拷过来一行行按空格效率低啊 all = (next)-> db.cookie.all (err, users)-> pos = 0 nextCommand = do -> next2 -> pos += 1 if pos<users.length then process.nextTick nextCommand else next() controller.test users[pos].username, next2

我也喜欢Coffee

我决定就像Quora上说的,为什么有的人不喜欢Coffee?因为它很新

所以我想写惯了JS的可能会不喜欢,但像我这样的新码农对Coffee是爱不释手啊

Node.js 创始人 Isaac Schlueter 在这篇帖子中讨论了 Node.js 的发展方向以及未来的计划。以下是一些关键点及其简要解释:

  1. 回调作为默认方式

    • 回调函数是实现异步编程的标准方式。
    fs.readFile('example.txt', function(err, data) {
      if (err) throw err;
      console.log(data);
    });
    
  2. Generators 和 Promises

    • Generators 和 Promises 是有用的工具,但它们不会成为默认方式。
    // 使用Promise
    const fs = require('fs').promises;
    
    async function readFile() {
      try {
        const data = await fs.readFile('example.txt');
        console.log(data);
      } catch (err) {
        console.error(err);
      }
    }
    
  3. Stream 流

    • Stream 将会更加高效和兼容。
    const { Readable } = require('stream');
    
    const readableStream = new Readable({
      read() {}
    });
    
    readableStream.on('data', (chunk) => {
      console.log(chunk.toString());
    });
    
  4. Domains

    • Domains 会进行重构,以更好地追踪错误。
    const domain = require('domain');
    
    const d = domain.create();
    
    d.on('error', (err) => {
      console.error(err);
    });
    
    d.run(() => {
      // 运行一些可能抛出错误的代码
    });
    
  5. C API

    • 添加了一个新的 C API,使得编写扩展更容易。
    // 示例C代码
    void Initialize(v8::Handle<v8::Object> target) {
      NODE_SET_METHOD(target, "helloWorld", HelloMethod);
    }
    
    void HelloMethod(const v8::FunctionCallbackInfo<v8::Value>& args) {
      args.GetReturnValue().Set(v8::String::NewFromUtf8(args.GetIsolate(), "Hello World!"));
    }
    
  6. Module 系统

    • 模块系统不会改变。
    const fs = require('fs');
    
    fs.readFile('example.txt', (err, data) => {
      if (err) throw err;
      console.log(data);
    });
    
  7. TypeScript 和 CoffeeScript

    • TypeScript 和 CoffeeScript 不会加入核心库,但它们依然可以通过模块系统使用。
  8. VM 模块

    • VM 模块已经进行了改进,支持多文档。
    const vm = require('vm');
    
    const context = {
      global: {}
    };
    
    vm.createContext(context);
    
  9. 同步子线程

    • 同步子线程机制已添加。
    const worker_threads = require('worker_threads');
    
    if (worker_threads.isMainThread) {
      const { Worker } = worker_threads;
    
      const worker = new Worker(__filename);
    
      worker.on('message', (msg) => {
        console.log(msg);
      });
    } else {
      parentPort.postMessage('Hello from worker thread!');
    }
    

这些变化都旨在提高 Node.js 的稳定性和性能。

回到顶部