一定要规范并格式化你的代码

发表于 3年以前  | 总阅读数:303 次

大家好 ,在日常工作中,我们会接触形形色色的工程。如果工程使用的技术架构不同,可能会有对应不同的代码规范。而每个人的编码习惯是不一样的,也是难以短时间内改变的,这也是我们常常在开发一个新工程的时候,会遇到各种规范报错的原因。

此时,如果能有一套配置,能够让我们在写代码时不用考虑该工程的规则,只要在保存时就能够自动按照当前工程配置好的规则修复所有错误,这无疑会大大增加我们的开发体验和效率。

下面我将详细讲解为了实现这一目标,我们需要做什么,以及各种规范的基本配置。

EditorConfig

首先,我们需要一个基本的规范,例如缩进,如何换行等等。它要适用于所有的团队,适用于所有的语言,适用于所有的编辑器。

EditorConfig 能帮助我们实现这一点。它让所有的开发者在基本编码规范上保持一致。

我们需要做的是:

  1. 安装 EditorConfig 插件(有些编辑器默认支持 EditorConfig ,具体请看 这些编辑器不需要安装插件 (https://editorconfig.org/#pre-installed))。
  2. 配置 .editorconfig 文件。

以下是 .editorconfig 的用法和例子:

## 打开文件时,EditorConfig 插件会在打开的文件的目录和每个父目录中查找名为 .editorconfig 的文件。 
## 如果到达根文件路径或找到具有 root=true 的 EditorConfig 文件,将停止对 .editorconfig 文件的搜索。
## 如果 root=true 没有配置, EditorConfig 插件将会在工程之外寻找 .editorconfig 文件
root = true

## 使用规则匹配文件
## *            匹配任何字符串,路径分隔符 (/) 除外
## **           匹配任意字符串
## ?            匹配任何单个字符
## [name]       匹配给定的字符串中的任何单个字符
## [!name]      匹配不在给定字符串中的任何单个字符
## {s1,s2,s3}   匹配任意给定的字符串
## {num1..num2} 匹配num1和num2之间的任何整数,其中num1和num2可以是正数或负数
## 如规则[*.{js}]只对 .js 文件生效。一般来说,我们配置 [*] 对所有文件生效。
[*]

## 缩进方式。 值可以是 tab 或者 space
indent_style = space

## 缩进大小。当设置为 tab 时,会取 tab_width 的值。
indent_size = 2

## 通常不需要设置。当 indent_size = tab 时,才会生效。
tab_width = 2;

## 设置为 lf、cr 或 crlf 以控制如何表示换行符。
end_of_line = lf

## 设置为 latin1、utf-8、utf-8-bom、utf-16be 或 utf-16le 来控制字符集。
charset = utf-8

## 设置为 true 以删除换行符之前的任何空格字符,设置为 false 以确保不会。
trim_trailing_whitespace = true

## 设置为 true 以确保文件在保存时以换行符结束,设置为 false 以确保不以换行符结束。
inset_final_newline = true

Eslint

对于前端开发工程师来说,JavaScript 无疑是我们最好的伙伴了。而 ESLint,它是一款插件化的 JavaScript 代码静态检查工具,其核心是通过对代码解析得到的 AST(Abstract Syntax Tree,抽象语法树)进行模式匹配,定位不符合约定规范的代码。

社区里有很多不同版本的规范,每个团队也可能会制定自己的规范。编码风格千千万,而工程的配置就一套,在多人协作时就必然会出现规范报错的情况。我们需要配置一套规则,让我们不需要 Care 规则到底是什么,在保存文件的时候,自动按照工程规范格式化代码。

怎么办呢?

Eslint 提供了风格指南规则,并明确表示了哪些是可修复的:Stylistic Issues (https://cn.eslint.org/docs/rules/#stylistic-issues)

我们需要做的是:

  1. 本地安装 Eslint 和社区推荐的规范 eslint-config-airbnb (https://github.com/airbnb/javascript) (也可以是别的规范)。插件会使用安装的 Eslint 库(如果你还未安装:npm i eslint eslint-config-airbnb)。
  2. VSCode 安装 Eslint插件
  3. 添加 .eslintrc.js 配置文件。
  4. 更改 VSCode 的 setting.json 文件的配置。

其中,想要实现自动按照工程的规则格式化,第四步必不可少。

setting.json

如果你已经安装好了 Eslint插件,按 cmd + shif + p,打开 defaultSettings.json 文件,按 cmd + f 搜索 eslint 可以看到所有 ESlint 在 VSCode 内的默认配置。我们需要对它做一些修改。

还是按 cmd + shift + p 打开 settings.json 文件。这个文件是用户自定义配置,里面的配置会覆盖 defaultSettings.json 里的同名配置。我们在这个文件里对 ESLint 插件 的配置做一些修改,让它达到我们想要的效果。

首先,我们想要 保存时自动格式化,实现这个效果的配置有三种:

  • editor.formatOnSave + eslint.format.enable。前者配置:保存时格式化,后者配置:将 ESlint 规则作为格式化标准
  • eslint.autoFixOnSave
  • editor.codeActionsOnSave

其中,第二种 eslint.autoFixOnSave 已经被废弃。使用它会提示更改为 editor.codeActionsOnSave

而第一种和第三种都可以实现,但是更推荐使用第三种 editor.codeActionsOnSave,它支持更高的可配置性。

使用 editor.codeActionsOnSave 的时候,我们需要禁用其它格式化程序,最好的做法是将 ESlint 设置为格式化程序默认值。并且当我们这么做的时候,我们可以关闭 editor.formatOnSave,否则我们的文件将被修复两次,这是没有必要的。

以下便是我们需要在 setting.json 里新增的配置。(注释的地方是默认配置,无需新增)

// 编辑的时候检测还是保存的时候检测,默认在编辑的时候就检测。default: onType
// "eslint.run": "onType",

// default: false
// "eslint.format.enable": false,

// default: false
// "editor.formatOnSave": false,

"editor.codeActionsOnSave": {
  "source.fixAll.eslint": true
},
"[vue]": {
  "editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"[javascript]": {
  "editor.defaultFormatter": "dbaeumer.vscode-eslint"
},

// 始终在VSCode的右下角状态栏显示 ESLint 字样,查看 ESLint 运行状态,确保 ESLint 在正常运行
"eslint.alwaysShowStatus": true,

.eslintrc.js

接下来,我们聊聊 .eslintrc.js 文件。这个文件将会规定我们的 ESLint 具体该使用什么规则去规范我们的代码。

我们自己往往不需要去配置这个文件,因为工程一般都会配置好了一套规则。我们只需要使用这套规则去格式化代码就好了。

但是看懂每条规则的意义,对于我们也是很重要的,例如你想自己新建工程。

接下来,我将从 普遍用法Vue项目特殊配置React项目特殊配置 来看下如何配置 .eslintrc.js 文件。

普遍用法

  • 默认情况下,ESLint 支持 ES5 的语法。我们可以覆盖这个配置,启用对 ES6、 ES7 ... 的支持 (https://cn.eslint.org/docs/user-guide/configuring#specifying-parser-options)。
// 启用对 es6 的语法和全局变量的支持
{
  env: {
    es6: true,
  },
}
  • 如果我们想让 ESLint 不仅能识别浏览器环境中的语法,其它环境(https://cn.eslint.org/docs/user-guide/configuring#specifying-environments)(如 Node)我们也希望它能识别,这时候我们可以这样配置:
{
  env: {
    browser: true,
    node: true,
  },
}
  • 在一些项目中,我们需要特殊的解析器去解析我们的代码,是否是符合规范的。这时候我们可以使用 Parser (https://cn.eslint.org/docs/user-guide/configuring#specifying-parser)
{
  parser: 'babel-eslint',
}
  • 当访问当前源文件内未定义的变量时,no-undef (https://cn.eslint.org/docs/rules/no-undef) 规则将发出警告。如果你想在一个源文件里使用全局变量,推荐你 在 ESLint 中定义这些全局变量 (https://cn.eslint.org/docs/user-guide/configuring#specifying-globals),这样 ESLint 就不会发出警告了。

当访问当前源文件内未定义的变量时,no-undef 规则将发出警告。如果你想在一个源文件里使用全局变量,推荐你在 ESLint 中定义这些全局变量,这样 ESLint 就不会发出警告了。

{
  globals: {
    "__DEV__": true,
    "If": true,
    "For": true,
    "POBrowser": true
  },
}
  • ESLint 支持使用第三方插件 (https://cn.eslint.org/docs/user-guide/configuring#configuring-plugins)。在使用插件之前,你必须使用 npm 安装它。在配置文件里配置插件时,可以使用 plugins 关键字来存放插件名字的列表。插件名称可以省略 eslint-plugin- 前缀。
{
   plugins: ['react-hooks', 'jsx-control-statements'],
}
  • ESLint 附带有大量的规则。你可以使用注释或配置文件修改你项目中要使用的规则 (https://cn.eslint.org/docs/user-guide/configuring#configuring-rules)。要改变一个规则设置,你必须将规则 ID 设置为下列值之一:
  • "off"0 - 关闭规则
  • "warn"1 - 开启规则,使用警告级别的错误:warn (不会导致程序退出)
  • "error"2 - 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出)
{
    rules: {
        eqeqeq: 'off',
        curly: 'error',
        quotes: ['error', 'double']
    }
}
  • 配置定义在插件中的一个规则的时候,你必须使用 插件名/规则ID 的形式。比如:
{
  plugins: ['react-hooks', 'jsx-control-statements'],
  rules: {
    'arrow-parens': 0,
    'react-hooks/rules-of-hooks': 'error',
    'react-hooks/exhaustive-deps': 'warn',
    'jsx-control-statements/jsx-use-if-tag': 0,
    'react/jsx-no-undef': ['error', { 'allowGlobals': true }],
    'no-prototype-builtins': 'off',
  }
}
  • ESLint 的配置规则实在太多,如果我们自己一条条规则去配置,这个工作了将会非常大。我们可以直接拿现有的规范来使用 (https://cn.eslint.org/docs/user-guide/configuring#extending-configuration-files)。
{  extends: 'zoo/react',}

Vue 特殊配置

由于 Vue 单文件组件的特殊写法,针对 Vue 项目,需要做一些特殊的 ESLint 配置,以达到自动化的效果。

高亮语法支持

安装 Vetur插件

使用 ESLint 而不是 Vetur 做代码检测

Vetur 为 Vue 项目带来了语法高亮和便捷的操作。但是它本身也会自动开启对 Vue 文件的代码检测。这往往会和我们配置的 ESLint 有冲突。为了避免这一点,需要在 VSCode 的 settings.json 中做一些配置:

// 不允许它格式化代码
"vetur.format.enable": false,
// 不允许它做代码检测
"vetur.validation.template": false,
"vetur.validation.script": false,
"vetur.validation.style": false,

无需将 vue 添加进 eslint.validate,因为 eslint.probe 默认会检测 vue 类型文件。

然后,我们需要配置 .eslintrc.js 文件,里面用到的插件都需要本地安装。

module.exports = {
    root: true,
    // 如果是SSR项目,则需要配置node:true
    env: {
        browser: true,
        node: true,
    },
    // 为什么是这样的parser配置?https://eslint.vuejs.org/user-guide/#how-to-use-a-custom-parser
    parser: 'vue-eslint-parser',
    parserOptions: {
        parser: 'babel-eslint',
    },
    extends: [
        // 如果是nuxt.js的脚手架项目,则需要安装对应的插件并做以下配置
        '@nuxtjs',
        'plugin:nuxt/recommended',

        // 让eslint可以规范vue文件
        'plugin:vue/base',
        // vue3的项目需要使用,如果是vue2项目,使用 plugin:vue/recommended
        'plugin:vue/vue3-recommended',
    ],
    plugins: [
        // 注意这里不能配置 html 选项,为什么?https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
        'vue',
    ],
    // 配置自己的规则,覆盖上面继承的规则
    rules: {
        // 配置js的缩进为 2,switch case 语句的 case 也使用2个空格缩进
        indent: ['error', 2, { SwitchCase: 1 }],
        // 使用 eslint 检测 template里的代码,这里我配置 2 个空格缩进
        'vue/html-indent': ['error', 2],
    },
};

以上配置,大家根据自己的项目特点,自行删减即可。比如,如果你的项目不是 nuxt.js 的,可以去掉 extends 里的 '@nuxtjsplugin:nuxt/recommended

如果是 Vue cli 创建的项目,并且没有使用 ts,需要在项目根目录添加 jsconfig.json 文件。有关 jsconfig 的配置在这里:jsconfig (https://code.visualstudio.com/docs/languages/jsconfig)

React 特殊配置

React 项目中,因为是 .js 文件,一般不需要特殊的配置。但即使如此,针对 JSX 和 Hooks 的使用规则,我们仍然需要做一些事情

针对 React Hooks

lint 规则具体强制了哪些内容?(https://zh-hans.reactjs.org/docs/hooks-faq.html#what-exactly-do-the-lint-rules-enforce)

eslint-plugin-hooksReact 源码目录 packages 里提供的一个包。它会强制执行 Hooks 规则,它也是 Hooks API 的一部分。

npm i eslint-plugin-reack-hooks

.eslintrc.js

module.exports = {
  // eslint-plugin 可以简写
  plugins: ['react-hooks'],
}
针对 JSX

JSX 不过只是 React 的一个语法糖,其最终都会被 React 调用 React.createElement 编译成 React Element 形式。所以在 17 版本之前,如果我们使用到了 JSX 但是没有引入 React ,会提示 'React' must be in scope when using JSX。而在 17 版本之后, React 与 Babel 和 TypeScript 编译器合作,将转化任务交给了编译器自动转化。

如果我们是之前的转化版本,我们要获得对 JSX 的语法支持,我们需要安装 eslint-plugin-react,它内置了对 JSX 的代码规范检测。

{
  extends: ['plugin:react/recommended'],
}

如果不想使用内置的规则,我们也可以自定义规则

{
  plugins: ['react'],
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
    },
  },
  rules: {
    'react/jsx-no-undef': ['error', { "allowGlobals": true }],
  },
}

如果是新的转化版本,则需要做一点小小的更改,以便在使用 JSX 的时候,不会要求我们引入 React

{
  extends: ['plugin:react/recommended', 'plugin:react/jsx-runtime'],
}

StyleLint

在完成了以上的配置之后,我们已经可以对 .js 文件、.vue 文件的 templatescript 模块实现代码规范和保存时自动格式化了。但是对于 .css、.less、.scss 文件和 .vue 文件的 style 模块,我们还需要做额外的配置,否则样式部分不规范,我们也是没法检测并自动修复的。

我们需要做的是:

  1. npm i stylelint stylelint-config-standard stylelint-scss
  2. 安装 Stylelint插件
  3. 配置 .stylelintrc 文件。
  4. 配置 VSCode 的 setting.json 文件。

其中,第四步也是必须的,我们需要做如下配置:

// 防止编辑器内置的 [css] [less] [scss] 校验和此扩展 [stylelint] 报告相同的错误
"css.validate": false,
"less.validate": false,
"scss.validate": false,

// 保存时使用 eslint 和 stylelint 进行修复
"editor.codeActionsOnSave": {
  "source.fixAll.eslint": true,
  "source.fixAll.stylelint": true
},
// 默认会对很多文件进行检测,这是不必要的,我们只让他检测样式
"stylelint.validate": [
  "css",
  "html",
  "less",
  "postcss",
  "sass",
  "scss",
  "source.css.styled",
  "styled-css",
 ],

以上,我们的目标已经达成啦!

Prettier

代码格式化工具。很多同学都接触过这个工具,我个人深入了解了一下这个工具,以下是我的个人见解。先看下 Prettier 官方的一段话吧。

So why choose the “Prettier style guide” over any other random style guide? Because Prettier is the only “style guide” that is fully automatic. Even if Prettier does not format all code 100% the way you’d like, it’s worth the “sacrifice” given the unique benefits of Prettier, don’t you think?

可以看到,这个工具旨在让不同公司不同团队不需要考虑代码规范,实现自动化保存格式化。牺牲掉个性化内容。

但是往往不同的团队对规则的使用是不一致的,如果强制所有文件都使用 prettier 自动格式化,会出现与公司配置的代码规范检查工具(例如 ESLint) 冲突的情况。实际表现为自动保存之后,依然出现 ESLint 格式报错。

想让 prettier 生效,需要我们在 VSCode 里配置:

// 所有文件都使用 prettier 格式化
"editor.defaultFormatter": "esbenp.prettier-vscode",

// 只对 js 文件使用 prettier
"[javascript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
 }

// 所有文件都不指定自动格式化方式
"editor.defaultFormatter": null,

// js文件不指定自动格式化方式
"[javascript]": {
    "editor.defaultFormatter": null
 }

可以使用 .prettierrc 文件、VSCode 的 setting.json.editorConfig 来配置 prettier

推荐不常使用的文件类型,使用 prettier 去格式化。js,json,jsx,html,css,less,vue 等这些文件,使用工程统一的规范去格式化。

所以,我觉得完全可以卸载它。不知道你怎么看呢?

以上就是全部内容了,希望对你有所帮助~

本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/8dNVkKLdqfBJt3hiM75H6Q

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237229次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录