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 项目,创建一个新的分支和图标,做你任何你想做的事情吧。
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啊
能否详细解释一下?
扯淡
谁能解释一下啊?各种看不懂。
你應該誤會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方式了吧……
缩进的写小段程序好看,程序逻辑多了,业务复杂了,有更新的时候就麻烦了
混着看两种“语言”很不舒服,团队作事,用起来很麻烦。
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 的发展方向以及未来的计划。以下是一些关键点及其简要解释:
-
回调作为默认方式:
- 回调函数是实现异步编程的标准方式。
fs.readFile('example.txt', function(err, data) { if (err) throw err; console.log(data); });
-
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); } }
-
Stream 流:
- Stream 将会更加高效和兼容。
const { Readable } = require('stream'); const readableStream = new Readable({ read() {} }); readableStream.on('data', (chunk) => { console.log(chunk.toString()); });
-
Domains:
- Domains 会进行重构,以更好地追踪错误。
const domain = require('domain'); const d = domain.create(); d.on('error', (err) => { console.error(err); }); d.run(() => { // 运行一些可能抛出错误的代码 });
-
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!")); }
-
Module 系统:
- 模块系统不会改变。
const fs = require('fs'); fs.readFile('example.txt', (err, data) => { if (err) throw err; console.log(data); });
-
TypeScript 和 CoffeeScript:
- TypeScript 和 CoffeeScript 不会加入核心库,但它们依然可以通过模块系统使用。
-
VM 模块:
- VM 模块已经进行了改进,支持多文档。
const vm = require('vm'); const context = { global: {} }; vm.createContext(context);
-
同步子线程:
- 同步子线程机制已添加。
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 的稳定性和性能。