美文网首页
typescript基于nodejs开发游戏服务器

typescript基于nodejs开发游戏服务器

作者: 断舍离_9e83 | 来源:发表于2020-03-06 11:37 被阅读0次

    为什么要用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文件里面也是有搜索规则的,因为我们都是用第三方库,也不会改里面的东西,所以不深究也没关系。

    好了,先这么多吧,后面有需要再补充吧

    相关文章

      网友评论

          本文标题:typescript基于nodejs开发游戏服务器

          本文链接:https://www.haomeiwen.com/subject/coswdqtx.html