package.json 非官方字段集合

package.json 非官方字段集合

package.json 官方字段请参考 https://docs.npmjs.com/files/package.json。下面介绍的是非官方字段,也就是各种工具定义的相关字段。

1. yarn 相关字段

yarn: 类似 npm 的依赖管理工具,但 yarn 缓存了每个下载过的包,所以再次使用时无需重复下载,同时利用并行下载以最大化资源利用率,因此安装速度更快。

flat

{
  "flat": true
}

如果你的包只允许给定依赖的一个版本,你想强制和命令行上 yarn install --flat 相同的行为,把这个值设为 true

详细参考 yarn - flat.

resolutions

{
  "resolutions": {
    "transitive-package-1": "0.0.29",
    "transitive-package-2": "file:./local-forks/transitive-package-2",
    "dependencies-package-1/transitive-package-3": "^2.1.1"
  }
}

允许你覆盖特定嵌套依赖项的版本。有关完整规范,请参见选择性版本解析 RFC

详细参考 yarn - resolutions.

2. unpkg 相关字段

unpkg: 让 npm 上所有的文件都开启 cdn 服务。

unpkg

# jquery
{
  "unpkg": "dist/jquery.js"
}

正常情况下,访问 jquery 的发布文件通过 https://unpkg.com/jquery@3.3.1/dist/jquery.js,当你使用省略的 url https://unpkg.com/jquery 时,便会按照如下的方式获取文件:

# [latestVersion] 指最新版本号,pkg 指 package.json

# 定义了 unpkg 属性时
https://unpkg.com/jquery@[latestVersion]/[pkg.unpkg]

# 未定义 unpkg 属性时,将回退到 main 属性
https://unpkg.com/jquery@[latestVersion]/[pkg.main] 

详细参考 https://unpkg.com.

3. TypeScript 相关字段

TypeScript: JavaScript 的超集

types, typings

{
  "main": "./lib/main.js",
  "types": "./lib/main.d.ts"
}

就像 main 字段一样,定义一个针对 TypeScript 的入口文件。

详细参考 TypeScript documentation.

4. browserslist 相关字段

browserslist: 设置项目的浏览器兼容情况。

browserslist

{
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}

支持的工具:

详细参考 browserslist.

5. 发行打包相关字段

点击 Setting up multi-platform npm packages 查看相关介绍。

module

{
  "main": "./lib/main.js",
  "module": "./lib/main.m.js"
}

就像 main 字段一样,定义一个针对 es6 模块及语法的入口文件。

构建工具在构建项目的时候,如果发现了这个字段,会首先使用这个字段指向的文件,如果未定义,则回退到 main 字段指向的文件。

支持的工具:

详细参考 rollup - pkg.module.

browser

{
  "main": "./lib/main.js",
  "browser": "./lib/main.b.js"
}

指定该模块供浏览器使用的入口文件。

如果这个字段未定义,则回退到 main 字段指向的文件。

支持的工具:

详细参考 babel-plugin-module-resolver.

esnext

{
  "main": "main.js",
  "esnext": "main-esnext.js"
}

# or

{
  "main": "main.js",
  "esnext": {
    "main": "main-esnext.js",
    "browser": "browser-specific-main-esnext.js"
  }
}

使用 es 模块化规范,stage 4 特性的源代码。

详细参考 Transpiling dependencies with Babel, Delivering untranspiled source code via npm.

es2015

{
  "main": "main.js",
  "es2015": "main-es2015.js"
}

Angular 定义的未转码的 es6 源码。

详细参考 https://docs.google.com/document/d/1CZC2rcpxffTDfRDs6p1cfbmKNLA6x5O-NtkJglDaBVs/edit#.

esm

详细参考 adjusted proposal: ES module "esm": true package.json flag.

6. react-native 相关字段

react-native: 使用 react 组件技术写原生APP。

react-native

{
  "main": "./lib/main.js",
  "react-native": "./lib/main.react-native.js"
}

指定该模块供 react-native 使用的入口文件。

如果这个字段未定义,则回退到 main 字段指向的文件。

源代码查看.

7. webpack 相关字段

sideEffects

{
  "sideEffects": true|false
}

声明该模块是否包含 sideEffects(副作用),从而可以为 tree-shaking 提供更大的优化空间。

详细参考 sideEffects example, proposal for marking functions as pure, eslint-plugin-tree-shaking.

8. microbundle 相关字段

microbundle: 基于 rollup 零配置快速打包工具。

source

{
  "source": "src/index.js"
}

源文件入口文件。

详细参考 Specifying builds in package.json.

umd:main

{
  "umd:main": "dist/main.umd.js"
}

umd 模式 bundle 文件。

详细参考 Specifying builds in package.json.

8. parcel 相关字段

parcel: 零配置打包工具。

source

查看 parcel-bundler/parcel#1652.

9. babel 相关字段

babel: es6 -> es5 转码器。

babel

配置 babel

10. eslint 相关字段

eslint: js 代码检查与优化。

eslintConfig

配置 eslint

11. jest 相关字段

jest: js 测试库。

jest

{
  "jest": {
    "verbose": true
  }
}

配置 jest

详细参考 jest docs.

12. stylelint 相关字段

stylelint: style 代码检查与优化。

stylelint

配置 stylelint

详细参考 New configuration loader.

13. ava 相关字段

ava: js 测试库。

ava

{
  "ava": {
    "require": [ "@std/esm" ]
  }
}

配置 ava

详细参考 ava configuration.

14. nyc 相关字段

nyc: istanbul.js 命令行。

nyc

{
  "nyc": {
    "extension": [".js", ".mjs"],
    "require": ["@std/esm"]
  }
}

配置 nyc

详细参考 nyc docs.

15. CommonJS 保留字段

保留字段: build, default, email, external, files, imports, maintainer, paths, platform, require, summary, test, using, downloads, uid.

不可用字段: id, type, 以 _$ 开头的字段。

16. Standard JS 相关字段

Standard JS: js 代码检查与优化。

standard

{
  "standard": {
    "parser": "babel-eslint",
    "ignore": [
      "**/out/",
      "/lib/select2/",
      "/lib/ckeditor/",
      "tmp.js"
    ]
  }
}

配置 standard.

详细参考 https://standardjs.com/.

17. 其他

style

声明当前模块包含 style 部分,并指定入口文件。

支持的工具:

详细参考 Package.json "style" Attribute, istf-spec.

less

style 一样,但是是 less 文件。

支持的工具:

18. 更多

参考 package.json fields explained.

19. 后续

更多博客,查看 https://github.com/senntyou/blogs

作者:深予之 (@senntyou)

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

<think>我们正在处理一个关于Unity Networking(很可能是Mirror)的问题。用户报告说`NetworkWriterExtensions.Register`方法不存在。我们将分析原因并提供解决方案。 ### 问题分析 1. **API版本差异**: - `NetworkWriterExtensions.Register` 是Mirror网络库中用于注册自定义序列化器的方法。在Mirror的不同版本中,这个API可能有变化。 - 在Mirror的早期版本(例如v30之前)中,`NetworkWriterExtensions`类确实有`Register`方法。但在较新的版本(v30及以上)中,Mirror引入了新的序列化接口`INetworkSerializable`,并可能移除了`Register`方法。 2. **Mirror版本升级**: - 从Mirror v30.0.0开始,推荐使用`INetworkSerializable`接口来实现自定义类型的序列化,而不再使用`NetworkWriterExtensions.Register`。 - 如果用户升级了Mirror版本,旧代码中使用`Register`方法的代码就会失效。 3. **代码迁移**: - 如果用户从UNet迁移到Mirror,或者从Mirror旧版本升级到新版本,可能会遇到这个问题。 ### 解决方案 #### 方案一:降级Mirror版本(不推荐) 如果项目依赖旧版API,可以降级到支持`Register`方法的Mirror版本(例如v29.x.x)。但这不是长久之计,因为新版本通常有更多功能和修复。 #### 方案二:使用新的序列化接口(推荐) 从Mirror v30开始,使用`INetworkSerializable`接口替代自定义的`Serialize`/`Deserialize`方法和`Register`调用。 1. **修改结构体实现接口**: 将`GuestInfoState`结构体改为实现`INetworkSerializable`接口。 ```csharp using Mirror; // ... 其他命名空间 public struct GuestInfoState : INetworkSerializable { // ... 原有字段和属性 public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter { // 序列化/反序列化代码 serializer.SerializeValue(ref guestId); serializer.SerializeValue(ref m_guestName); serializer.SerializeValue(ref identityType); serializer.SerializeValue(ref aOrB); // ... 其他字段 // 注意:对于列表,需要先序列化长度,再逐个序列化元素 } } ``` 2. **移除旧的Serialize/Deserialize方法**: 删除原有的`Serialize`和`Deserialize`方法。 3. **移除Register调用**: 不再需要调用`NetworkWriterExtensions.Register`,因为Mirror会自动处理实现了`INetworkSerializable`的类型。 #### 方案三:使用扩展方法(如果坚持用旧方法) 如果项目不能立即迁移到新接口,可以自行实现扩展方法(但需要确保Mirror版本支持)。不过,Mirror官方已不再推荐这种方式。 ### 验证步骤 1. 检查Mirror版本: - 在Unity编辑器中,打开Package Manager,查看Mirror的版本。 - 如果版本号大于等于30.0.0,则必须使用方案二。 2. 修改代码: - 按照方案二修改`GuestInfoState`结构体。 3. 测试网络序列化: - 在Command和RPC中传递修改后的结构体,确保数据正确传输。 ### 常见问题 - **列表序列化**:在`NetworkSerialize`方法中,对于列表需要手动处理长度和每个元素。 ```csharp // 示例:序列化一个字符串列表 int count = skillInfoTypes.Count; serializer.SerializeValue(ref count); if (serializer.IsReader) { skillInfoTypes = new List<string>(count); for (int i = 0; i < count; i++) { string element = default; serializer.SerializeValue(ref element); skillInfoTypes.Add(element); } } else { foreach (string element in skillInfoTypes) { serializer.SerializeValue(ref element); } } ``` ### 总结 `NetworkWriterExtensions.Register`方法不存在的主要原因是Mirror版本升级导致API变更。推荐使用新的`INetworkSerializable`接口进行自定义类型的序列化[^3]。 --- ### 相关问题 1. **如何在Mirror中同步自定义数据类型?** 2. **Unity网络游戏中如何优化数据传输?** 3. **Mirror和UNet在序列化机制上有何区别?** 4. **如何处理Unity网络游戏中的版本兼容性问题?** 5. **Mirror中如何同步大型数据结构?** [^3]: Unity3D技术栈梳理:网络专题</think>### `NetworkWriterExtensions.Register` 方法不存在的原因及解决方案 #### 问题原因分析 1. **API 版本差异** `NetworkWriterExtensions.Register` 是 **Mirror 网络库的旧版 API**(v30.0.0 之前)。在 Mirror 的更新中,此方法已被弃用并移除: - Mirror v30+ 引入了新的序列化接口 `INetworkSerializable` - 旧版 `Register` 方法在 v30+ 版本中完全不存在[^3] 2. **Unity 官方 UNet 的混淆** 若使用 Unity 原生的 UNet 系统(非 Mirror): - UNet 原生不支持自定义类型序列化注册 - `NetworkWriterExtensions` 类在 UNet 中不存在 3. **命名空间缺失** 未正确导入 Mirror 的命名空间: ```csharp using Mirror; // 必须添加 ``` --- ### 解决方案 #### 方案一:升级到 Mirror v30+ 并实现新接口(推荐) ```csharp using Mirror; // 1. 让结构体实现 INetworkSerializable public struct GuestInfoState : INetworkSerializable { // ...原有字段... // 2. 实现 NetworkSerialize 方法 public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter { serializer.SerializeValue(ref guestId); serializer.SerializeValue(ref m_guestName); serializer.SerializeValue(ref identityType); // 其他字段... // 3. 列表序列化示例 serializer.SerializeValue(ref skillInfoTypes); // 自动处理列表 } } ``` **优势**:无需手动注册,Mirror 自动处理序列化[^3]。 #### 方案二:降级 Mirror 版本(临时方案) 1. 修改 `Packages/manifest.json`: ```json { "dependencies": { "com.mirrornetworking.mirror": "29.0.0" // 使用v29旧版 } } ``` 2. 注册方法: ```csharp // 初始化时调用 NetworkWriterExtensions.Register<GuestInfoState>( (writer, value) => value.Serialize(writer), reader => { var state = new GuestInfoState(); state.Deserialize(reader); return state; } ); ``` #### 方案三:UNet 原生解决方案(不推荐) ```csharp // 重写 GuestInfoState 的序列化 public static class GuestInfoStateWriter { public static void WriteGuestInfoState(this NetworkWriter writer, GuestInfoState value) { value.Serialize(writer); // 调用你的Serialize方法 } public static GuestInfoState ReadGuestInfoState(this NetworkReader reader) { var state = new GuestInfoState(); state.Deserialize(reader); return state; } } // 使用示例 writer.Write(value); // Unity会自动识别 ``` --- ### 验证步骤 1. **检查 Mirror 版本** ```csharp // 代码中打印版本 Debug.Log("Mirror Version: " + typeof(NetworkManager).Assembly.GetName().Version); ``` 2. **添加序列化日志** 在 `Serialize`/`Deserialize` 中添加调试日志: ```csharp public void Serialize(NetworkWriter writer) { Debug.Log($"序列化: ID={guestId}, Name={m_guestName}"); // ... } ``` 3. **测试网络传输** 在 Command 中验证数据: ```csharp [Command] void CmdTest(GuestInfoState state) { Debug.Log($"服务器收到: ID={state.guestId}"); } ``` --- ### 常见错误排查 1. **反序列化空列表** 确保构造函数初始化集合: ```csharp public GuestInfoState() { skillInfoTypes = new List<string>(); // 必须初始化 skillBuffTypes = new List<SkillBuffType>(); } ``` 2. **网络权限问题** 调用 Command 的对象需满足: - 挂载 `NetworkIdentity` 组件 - 继承 `NetworkBehaviour` - 客户端拥有权限(`isLocalPlayer`) 3. **数据包过大** 若字段过多,调整最大包大小(Mirror 默认 1200 字节): ```csharp // 在 NetworkManager 中 maxPacketSize = 2000; ``` --- ### 总结 `NetworkWriterExtensions.Register` 不存在的主要原因是: 1. Mirror v30+ 已移除该 API → 需改用 `INetworkSerializable` 接口[^3] 2. Unity 原生 UNet 不支持此扩展方法 3. 项目未正确引用 Mirror 命名空间 **推荐升级 Mirror 并使用 `INetworkSerializable` 接口**,这是 Mirror 官方维护的现代序列化方案。 --- ### 相关问题 1. 如何在 Mirror 中同步自定义数据结构? 2. Unity 网络游戏中如何优化序列化性能? 3. Mirror 和 UNet 在序列化机制上有何区别? 4. 如何处理网络游戏中的版本兼容性问题? 5. 如何调试 Unity 网络数据包丢失问题? [^3]: Unity3D技术栈梳理:网络专题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值