目录

Node.js 实现浏览器终端

最近要实现一个 web terminal,调研了几个开源的包,最后选择了 Cloud Commander

选择 Cloud Commander 几个原因:

  • 功能更丰富,支持 vim,支持查看多种文件(images, txt, video …),Hot keysTerminal
  • 文档详细。
  • 还在不断的完善,已经更新到 v10.3.2

安装

npm install cloudcmd -g

因为 Cloud Commander 的 Terminal 功能默认是关闭的,如果使用需要安装 gritty

npm i gritty -g

安装好之后要配置 --terminal--terminal-path

安装中的错误

如果碰到下面两种错误,都是因为权限引起的错误:

/images/web-terminal/error1.JPG /images/web-terminal/error2.JPG

解决:

npm config set user 0
npm config set unsafe-perm true
npm install cloudcmd -g
npm install gritty -g

简单使用

安装好之后直接运行 cloudcmd 就会打开一个默认的端口 8000,然后访问 http://localhost:8000 就可以了。

如果要使用 terminal 功能:

# 查看 gritty 的路径
gritty --path

# 输出
/usr/local/lib/node_modules/gritty

cloudcmd --terminal --terminal-path /usr/local/lib/node_modules/gritty --save

然后访问 http://localhost:8000

/images/web-terminal/terminal1.JPG /images/web-terminal/terminal2.JPG

关于更多配置使用查看 Cloud Commander 官方文档。 如果只是想实现 terminal 功能,可以直接安装使用 gritty

与 Express 集成

gritty 与 Express 集成

npm i gritty socket.io express --save

创建服务端:

const gritty = require('gritty');
const http = require('http');
const express = require('express');
const io = require('socket.io');

const app = express();
const server = http.createServer(app);
const socket = io.listen(server);

const port = 1337;

app.use(gritty())
app.use(express.static(__dirname));

gritty.listen(socket);
server.listen(port);

页面 index.html

<div class="gritty"></div>
<script src="/gritty/gritty.js"></script>
<script>
    gritty('.gritty');
</script>

cloudcmd 与 Express 集成

npm i cloudcmd socket.io express --save

创建服务端:

const http = require('http');
const cloudcmd = require('cloudcmd');
const io = require('socket.io');
const app = require('express')();

const port = 1337;
const prefix = '/cloudcmd';

const server = http.createServer(app);
const socket = io.listen(server, {
    path: `${prefix}/socket.io`
});

const config = {
    prefix // base URL or function which returns base URL (optional)
};

const plugins = [
    __dirname + '/plugin.js'
];

const filePicker = {
    data: {
        FilePicker: {
            key: 'key'
        }
    }
};

// override option from json/modules.json
const modules = {
    filePicker,
};

app.use(cloudcmd({
    socket,  // used by Config, Edit (optional) and Console (required)
    config,  // config data (optional)
    plugins, // optional
    modules, // optional
}));

server.listen(port);