【问题标题】:Sharing code between node js project and a web site project在 node js 项目和网站项目之间共享代码
【发布时间】:2014-07-07 19:16:18
【问题描述】:

所以我开始在 typescript 中编写一个国际象棋引擎作为一个副项目。我最初打算让它成为一个 CLI,就像大多数其他通过标准输入和标准输出交互的国际​​象棋引擎一样。这样我就可以将它插入像 Arena 这样的 GUI 并针对其他引擎进行测试。为此,我决定将其作为节点项目进行。

我在多个文件中设置了它,其中 1 个是 UCI(通用国际象棋接口)实现,其余的是国际象棋逻辑和 AI 逻辑。在敲了几次头试图理解打字稿中的模块之后,我终于让它工作了。

现在我决定自己编写一个简单的 GUI 作为带有 h​​tml+typescript+jquery 的网页会很有趣。现在,我想使用我编写的所有逻辑模块,但我发现这是不可能的。据我了解,您不能在浏览器中使用 CommonJS,所以我可以让它工作的唯一方法是使用内部模块,我需要修改 .ts 文件以将代码包装在 module X{ } 块中并重新编译它们每次我改变一些东西时,对于 GUI。这种情况似乎远非理想,我想知道是否有办法解决它......

【问题讨论】:

    标签: node.js typescript commonjs


    【解决方案1】:

    使用http://browserify.org/ 在前端添加类似 CommonJS 的支持。

    但也请阅读这个(略过时的)问答:How should I go about writing a node.js web application with both server and client side code?

    【讨论】:

    • 效果好于预期。我现在在同一个项目中设置了所有内容,只需要在 gui 脚本上运行 browserify。现在,如果我可以设置 VS2012 以在构建项目后自动运行 browserify,这将是最重要的。我在节点项目的配置中找不到该选项。
    【解决方案2】:

    为服务器和浏览器使用外部模块。

    为浏览器编译时,使用开关指定AMD模块模式:

    tsc --module amd app.ts
    

    并使用RequireJS 为您加载模块。

    <script src="require.js" data-main="app.js"></script>
    

    您需要针对不同的目标进行编译,但 TypeScript 中的源代码可以相同。

    【讨论】:

      【解决方案3】:

      我创建了一个演示项目来在客户端和服务器之间共享代码:https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js

      它将 amd/commonjs 和服务器文件的公共文件仅编译为 commonjs,而仅将客户端文件编译为 amd。它使用grunt-ts 来管理这个:https://github.com/grunt-ts/grunt-ts

      【讨论】:

        猜你喜欢
        • 2014-12-08
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多