2021年5月12日, stackblitz 团队在 谷歌 I/O 上提到了一下的内容:
几年前,我们就能感觉到,web 开发正在走向一个关键的拐点。
WebAssembly 和新的 capabilities api 的出现,使得编写一个基于 WebAssembly 的操作系统似乎成为可能,该操作系统功能强大到可以完全在浏览器中运行 Node.js。 它提供一个比本地环境更快、更安全、更一致的卓越开发环境,以实现无缝代码协作,而无需设置本地环境,这个目标似乎离 Web 开发人员越来越近了。
这项技术在 StackBlitz 中的在线 IDE 中可以体验到,其性能可以碾压同类的 web IDE。
如今,这项技术终于对公众开放。
在2021年,我们宣布了 WebContainer,这是一个完全新颖的基于 WebAssembly 的操作系统,它使Node.js能够完全在浏览器内部运行。在过去的两年中,数以百万计的开发人员每月在 Stackblitz 编辑中使用 WebContainers。
今天,我们很高兴发布 WebContainer API供公众使用,我们邀请整个JavaScript和Node.js社区与我们一起在WebContainers上构建您自己的应用程序!我们构建了Stackblitz经典编辑器,CodeFlow IDE和Web Publisher:我们迫不及待地想看看您的想法!
我们可以直接在 webContainer 官网在线体验这项技术
WebContainers 是一个基于浏览器的运行时,用于执行 Node.js 应用程序和操作系统命令,它完全运行在您的浏览器页面中。
我的理解,webContainer 就是一个可以运行在浏览器页面中的微型操作系统,提供了文件系统、运行进程的能力,同时内置了 nodejs、npm/yarn/pnpm 等包管理器。
对于服务提供方(例如在线 IDE)来说,与在云端虚拟机上运行命令相比,有以下好处:
在代码中,找个地方调用以下代码即可
import { WebContainer } from '@webcontainer/api';
// Call only once
const webcontainerInstance = await WebContainer.boot();
启动 webContainer,相当于电脑开机,启动完才能用
WebContainers 需要使用 SharedArrayBuffer 这个 API(这个 API 有安全需求)。因此,您需要设置Coop/COEP标头:
# 保护源站免受侵害
Cross-Origin-Embedder-Policy: require-corp
# 保护源站免受攻击
Cross-Origin-Opener-Policy: same-origin
另外,网站必须要使用 https,本地开发时使用 localhost 也行,否则 SharedArrayBuffer 是不安全的,会被禁用。
使用 mount API 进行挂载文件和目录
const files = {
// 这是一个文件,package.json 是文件名
'package.json': {
file: {
contents: `
{
"name": "vite-starter",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"vite": "^4.0.4"
}
}`,
},
},
// 这是一个目录,src 是目录名
src: {
// 目录下会有 directory 的属性
directory: {
// 这是一个文件,叫 mian.js
'main.js': {
// 文件下有 file 的属性
file: {
contents: `
console.log('Hello from WebContainers!')
`,
},
},
},
},
};
await webcontainerInstance.mount(files);
然后就可以通过 readFile 读取文件:
const file = await webcontainerInstance.fs.readFile('/package.json');
目前 webContainer 的 fs 支持以下几种文件操作:
可以在 webContainer 中运行命令,例如 npm install
webcontainerInstance.spawn('npm', ['install']);
spawn 方法接受三个参数:
下面是一个封装好的安装依赖的函数
async function installDependencies() {
const installProcess = await webcontainerInstance.spawn('npm', ['install']);
return installProcess.exit;
}
调用 Spawn 函数返回 WebContainerProcess。它的 output 属性是一个可读流 readableStream <string> ,它接收所有的输出,包括 stdout and stderr,下面代码可已经进程的输出,打印出来
const installProcess = await webcontainerInstance.spawn('npm', ['install']);
installProcess.output.pipeTo(new WritableStream({
write(data) {
console.log(data);
}
}));
有些命令可以启动 dev Server,例如 npm run start 启动一个 vite/express Server。
这时候,可以用过 on 监听到 server-ready 事件
async function startDevServer() {
// 执行 `npm run start` 启动 Express app
await webcontainerInstance.spawn('npm', ['run', 'start']);
// 等待 `server-ready` 事件
webcontainerInstance.on('server-ready', (port, url) => {
// 通过这个 url,就能访问 server
window.open(url)
});
}
我们平时启动的 dev Server,会通过类似 http://localhost:8080 的方式进行访问,但如果在网页中运行 dev Server就不行了,因为由于安全限制,网页没有足够的权限绑定端口。
因此 webContainer 会提供一个 url,代替 http://localhost:8080 去访问,这也就是 server-ready 事件,会在回调参数中传 url 的原因
url 长这样:https://localhost5173-3ca0-2jv4wvy8--3111.local-corp.webcontainer.io/
这个请求实际上没有请求到外部,而是在 Service Worker 中直接返回了,通过这样的方式,达到了与平时访问 http://localhost:8080 一样的效果
webContainer 非常适合交互式编码体验,它可以用在生产级IDE,编程教程,下一代文档等应用上。虽然看起来功能十分有限,但这其实是一个很有意义的尝,是一个从 0 到 1 的突破,尝试在浏览器端运行一个微型的操作系统,相信不久的未来,不仅仅是 nodejs,其他的语言,例如 python、Java,或者运行其他更多的程序。
作者:candyTong
链接:https://juejin.cn/post/7201464975722332216
关于 Node.js 里 ES6 Modules 的一次更新说明,总结来说:CommonJS 与 ES6 Modules 之间的关键不同在于代码什么时候知道一个模块的结构和使用它。
在这个教程中,我们会开发一个命令行应用,它可以接收一个 CSV 格式的用户信息文件,教程的内容大纲:“Hello,World”,处理命令行参数,运行时的用户输入,异步网络会话,美化控制台的输出,封装成 shell 命令,JavaScript 之外
首先你需要生成https证书,可以去付费的网站购买或者找一些免费的网站,可能会是key或者crt或者pem结尾的。不同格式之间可以通过OpenSSL转换
nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。
3G的大文件分1500个2M二进度文件,通post方法发送给node服务,服务器全部接收到文件后,进组装生成你上文件。
JavaScript比C的开发门槛要低,尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,JavaScript在浏览器中有广泛的事件驱动方面的应用,考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。
node.js的第一个基本论点是I / O的性能消耗是很昂贵。因此,使用当前编程技术的最大浪费来自于等待I / O完成。有几种方法可以处理性能影响
在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作。那么服务器端要如何进行鉴权呢?
我们经常跟Node.js打交道,即使你是一名前端开发人员 -- npm脚本,webpack配置,gulp任务,程序打包 或 运行测试等。即使你真的不需要深入理解这些任务,但有时候你会感到困惑,会因为缺少Node.js的一些核心概念而以非常奇怪的方式来编码。
运行在 Node.js 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要处理的任务需要一件件挨着做,不能多个事情一起做。happypack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!