javascript - 在同一个 MVC 项目中的 C# 类和 JS 文件中使用相同的静态数据,而无需在运行时一次又一次地重建

标签 javascript c# asp.net-mvc visual-studio

问题

我的问题(用我能说的最笼统的术语来说)是: * 有一些静态数据(很少更改,需要重新编译站点),以一系列配置字符串的形式,如 URI、哈希等,用于需要在 MVC 站点的 c# 中使用的几个文件以及一些 JavaScript 中的一些。 * 我们不想复制数据,因为它必然会不同步并导致我们难以追踪各种错误。 * 理想情况下,我们希望创建 JS 文件,并在构建时将数据插入其中,直接从存储它的 c# 类中获取数据,这样就不会在每次请求时浪费大量时间重新构建 JS而且 c# 类也不需要在 js 文件中挖掘以试图提取数据。

目前的研究和潜在的解决方案

T4 文本模板

我们考虑过使用 T4(.tt 文本模板)来构建 JS,但只是刚刚遇到 T4,还没有找到一种方法(如果存在的话)访问 T4 文件中现有的项目类来生成 JS。

使用类似 Gulp 的东西

我们也可以使用 Gulp 并在 JS 中构建一些东西来直接从类文件中提取数据来构建 JS,但到目前为止我们一直在使用 NuGet、一些 VS 扩展和我们的 TFS 部署服务器,但并没有真正想要增加 Gulp 和 ether 的复杂性,将所有内容切换回它,或者将我们的构建拆分为 Gulp 和 MSBuild/TFS。我们对此有一些经验,发现它给我们带来了更多的问题来保持它的运行,这超出了它的值(value)。

在运行时构建和缓存 JS 文件

如前所述,我们还可以创建一个在运行时构建和返回 JS 的页面。我们可以在第一次构建后缓存输出,因为它不会改变,但它仍然会影响我的 MVC,而不仅仅是一个文件,并且需要存储和检索缓存的数据。

最后一种方法(在运行时构建和缓存 JS 文件)是我倾向于使用的方法,因为它将是最干净、最容易在未来被新开发人员遵循的方法,并且不需要任何额外的包/libraries 添加到项目中。

最佳答案

虽然在运行时构建和缓存 .js 文件当然是一种选择,但这会浪费网络服务器上的少量 RAM 和 CPU 周期。更不用说,缓存可能会在调试过程中造成困惑。

IMO,更好的选择是

  1. 将静态数据转化为JSON或XML等通用文件格式
  2. 使用 T4 模板读取通用格式并构建 .js.cs 文件
  3. 创建一个批处理文件来运行 T4 转换并将其添加为 pre-build event.csproj 文件中作为 in this answer

这样,作为正常构建过程的一部分(包括在调试过程中),文件是用数据构建的,.js 文件可以作为静态文件部署到服务器,作为构建过程的一部分正常的部署过程。为了帮助避免混淆,T4 模板可以包含警告,不要在开发期间修改输出文件。

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

如果您不熟悉 T4 技术并且不想要任何额外的 .tt,您当然可以使用从 JSON 或 XML 读取源数据的定制控制台应用程序替换 T4项目中可能会使新开发人员感到困惑的文件。但是您应该考虑到 .cs.js 文件在开发过程中更改的频率 - T4 不必编译成工具即可使用它.

Gulp 也是一个选项,但对于像这样微不足道的事情,不值得将其添加到构建管道中。仅当您已经在应用程序或构建中使用 Gulp 时才考虑它。

但是无论您如何切分,这听起来更像是构建步骤的候选者,而不是运行时发生的事情。

关于javascript - 在同一个 MVC 项目中的 C# 类和 JS 文件中使用相同的静态数据,而无需在运行时一次又一次地重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48343701/

相关文章:

javascript - AngularJS - 在哪里放置第三方插件默认值?

javascript - 如果图像 'src' 是 '(unknown)' 替换为 'missing.png'

c# - 您会在数据库调用中使用流畅的验证吗

c# - MVC 3 : DropDownList on an Edit Form for an object that is a property of a ViewModel

javascript - 嵌套 JSON 值不绑定(bind) MVC

javascript - 如何以 Angular 创建自定义指令

c# - 逗号分隔vs Elasticsearch 中的列表

c# - 通过引用传递HashSet <string>

c# - 依赖注入(inject)——从接口(interface)创建对象

c# - 使用asp.net路由url