为什么要用nodejs开发游戏服务器。
首先,nodejs生态开源的资源和库很多,很多功能都用现成的组件,稳健又高效。
其次,能和客户端统一语言(客户端用cocos creator typescript 开发的),同一种语言的话,这样一来就数据模块还有逻辑代码就可以共享,提高效率的同时也保证了两边逻辑的一致性。
再者,部署方便,服务器开发完成之后,通过webpack打包成一个js文件,云服务器上部署非常方便。
部署准备;
第一步,安装nodejs和typescript,再安装vscode 的时候,一般都给顺带安装了,所以比较简单
第二步,更改npm源镜像
npm config set registry https://registry.npm.taobao.org
默认的镜像再国外,很慢,很不稳定,毕竟是在墙外面。
npm config get registry 通过这个命令可以查看更改成功后的源镜像
第三步,把typescript 更新一下,我一般是要更新到最新的,如果不是最新,后面安装某些库的时候会报错.
npm update -g typescript
tsc -v 查看typescript 编译器版本
建立文件夹结构:
这里主要讲
project2020
-----Server
----Common
----Shared
----CenterServer
----GateServer
解释: centerServer 是中心服务器,GateServer是网关服务器,后续还有更多其他服务器,并列的结构。这里的Common用来存放服务器之间的共享代码,Shared用来存放和客户端的共享代码。
我把Server作为根目录。
第一步 控制台cd 到Server目录,执行 npm init 会产生package.json这个文件,由于我们最终不是发布包(我们会用webpack打包成一个js文件),所以其实这个一步不用也可以,不是刚需,但是为了更正规一点,我们还是这么操作一下,打包带时候还是派上用场了。
第二步,tsc --init 这个会生成tsconfig.json,这个就是编译ts的配置文件,定义怎么编译我们的项目里面会有很多字段,详细的解释参看tsconfig注解
关于编译:在当前目录下 执行tsc -p ./ 就可以编译我们的ts脚本了,命令的最后一部分是一个路径,只想tsconfig所在的位置,按照tsconig里的配置来编译文件。当tsconfig里面watch字段配置成true的话,就可以实现增量编译,也就是改动了即时编译,很好用。
关于vscode调试,第一次点vscode 的调试按钮会提示我们创建launch.json 创建好之后就可以了,修改内容为
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "gateSvr",
"program": "${workspaceFolder}/Server/build/GateServer/GateSvr.js",
},
{
"type": "node",
"request": "launch",
"name": "CenterSvr",
"program": "${workspaceFolder}/Server/build/CenterServer/centerSvr.js",
//"program": "${workspaceFolder}/Server/dist/bundle.js",
//"preLaunchTask": "tsc: build - tsconfig.json",
//"outFiles": ["${workspaceFolder}/Server/build/**/*.js"]
}
]
}
我创建了两个一个是gatesvr的调试,一个是centerSvr的调试,后面还可以其他server了。
注意一下就是 tsconfig里面的sourcemap 要打开 设置成true,这样才可以断点调试
这里的program我直接指向了 编译生成后的服务器js文件,没有用preLaunchTask。
在开发的过程中我 tsconfig的watch选项开着,所以几乎是实时增量编译,调试直接启动一样,很方便的。
最后就是打包
安装webpack,instal webpack --save-dev 。
--save的意思是添加到package.josn的依赖项里面,--save-dev表示添加到package.josn的开发模式下的依赖项里面,这个试一下就可以了。因为最终我们不会刚性使用package.json,所以也不是很重要,但是为了正规起见,还是这么操作一下吧。
然后再在server目录下建立一个webpack.config.js的文件,内容如下:
```
const path = require('path');
module.exports = {
entry: { center : './build/CenterServer/centerSvr.js',
gate : "./build/GateServer/GateSvr.js"
},
target: 'node',
//devtool: 'inline-source-map',
resolve: {
extensions: [ '.tsx', '.ts', '.js' ],
},
output: {
filename: '[name].js',
path: path.resolve(__dirname, 'dist'),
},
};
```
入口点我设置了多个,entry 的值可以个json对象,里面的key 是自定义的,上面的center,gate是我随便写的,不是配置文件的关键字,后面还要加dbserver,但是value 不是随便写的,需要指向真实想生成的入口文件。
output里面的 filename字段,因为我是要生成多个文件,所以用了[]。
然后回到cmd,cd 到server这个目录下,执行 webpack 回车,就可以开始打包了。一次运行打包所有服务器。
至此,工作流定型了,tsconfig开启watch,和 sourcemap ,实现改动就会编译,配合launch.json ,拥有断点调试功能,最后开放完成发布版本的时候,执行webpack命令完成打包。
以上是我个人的工作流程,不是最优的,只是我觉的简单够用。webpack可以做到直接从ts打包调试,我不折腾了,毕竟我也不是天天打包,发版本的时候才打包。
最后说一下安装依赖项的问题,因为是ts 我们需要代码提示,要安装实现文件和提示文件。比如安装lodash
npm install lodash --save
npm install @types/lodash
npm install --save-dev @types/node
上面是安装实现文件,后面是安装提示文件。
@types/ 这是一个固定格式 后面跟着库的名字。
websocket 模块我用了ws,此模块的周下载量是百万级的,用的人蛮多。
npm install ws --save
npm install @types/ws --save-dev
最后需要知道,编译器在解析文件的时候的搜索路径,
import { sharedTest } from "../Shared/shared";
import * as _ from "lodash"
注意这两个是不一样的,一个是带路径的,一个是不带的,不带的就是我们的库,会搜索当前目录下的node_module文件夹,没找到继续上层找node_module,直到根目录还是没有,就会取node的全局安装目录的node_module里面找。在node_module文件里面也是有搜索规则的,因为我们都是用第三方库,也不会改里面的东西,所以不深究也没关系。
好了,先这么多吧,后面有需要再补充吧