当前位置: 首页 > news >正文

ESLint 配置文件全解析:格式、层叠与扩展(3)

配置文件系统处于一个更新期,存在两套配置文件系统,旧的配置文件系统适用于 v9.0.0 之前的版本,而新的配置文件系统适用于 v9.0.0之后的版本,但是目前还处于 v8.x.x 的大版本。

配置文件格式

在 ESLint 中,支持如下格式的配置文件:

  • JavaScript:使用 .eslintrc.js 并且导出一个包含你配置的对象
  • JavaScript(ESM):在 v9.0.0 之前 ESLint 是不支持 ESM 风格模块化的,假设我们的源码使用的 ESM 模块化风格,并且我们在 pacakge.json 中明确配置了 type: module,这个时候就需要将 ESLint 的配置文件命名为 .eslintrc.cjs(也就是说要使用 CommonJS 风格来命令 ESLint 的配置文件)
  • YAML:使用 .eslintrc.yaml 或者 .eslintrc.yml
  • JSON:使用 .eslintrc.json 来配置 ESLint
  • package.json:在 pacakge.json 中,可以创建一个名为 eslintConfig 的属性,然后对 ESLint 进行配置

如果在项目的同一目录下存在多种格式的配置文件,那么这些配置文件之间是有一个优先级顺序的。顺序如下:

  1. .eslintrc.js
  2. .eslintrc.cjs
  3. .eslintrc.yaml
  4. .eslintrc.yml
  5. .eslintrc.json
  6. package.json

在早期的时候(v7.0.0之前),ESLint 支持使用 .eslintrc 文件来作为 ESLint 的配置文件,但是从 v7.0.0 开始,官方就已经明确废弃掉这种用法,从 v7.0.0 之后,就建议使用上述的格式来作为 ESLint 的配置文件。但是为了兼容性,之前的 .eslintrc 格式的配置文件依然能够使用,但是还是建议最好使用官方推荐的格式来进行配置。

使用配置文件

想让我们的配置文件生效,有两种方式:

  • 在项目中创建上述的配置文件,ESLint 在做检查的时候会自动寻找配置文件并应用里面的配置
  • 在 CLI 命令中通过 --config 选项来手动指定配置文件的位置
eslint -c myconfig.json myfiletotest.js

配置文件的层叠

在 ESLint 中支持配置文件的层叠,这是一种管理项目中多个配置文件的方式,这种特性允许你在项目中根据不同的部分应用不同的规则。

例如我们在 src/.eslintrc.js 中,有如下的配置:

module.exports = {env: {browser: true,es2021: true,node: true},rules: {semi: ['error', 'always']}
};

那么现在,我们就存在两份 ESLint 的配置,此时 ESLint 会在当前目录下查找配置文件,然后会一层一层往上寻找,将找到的所有的配置文件进行一个规则合并。

如果子目录下配置文件的规则和父目录下的配置文件规则发生重合,那么子目录下的配置文件规则会覆盖父目录下配置文件的同名规则。

如果我们需要就应用当前目录的配置文件,不要再往上找了,那么可以在当前的配置文件中添加一个 root:true,添加了此配置项后,表示就应用当前目录下找到的配置文件,停止继续往上搜索。

目前我们知道,要对 ESLint 进行配置有多种方式:

  • 配置文件方式
  • 行内注释方式
  • CLI 命令行

那么有这么几种方式,优先级如何呢?优先级顺序从高到低如下:

  • 行内注释配置方式
  • CLI 命令行配置方式
  • 配置文件的方式(虽然它的优先级是最低的,但却是用得最多的)
    • 从 ESLint v8.0.0 开始,已经不再支持个人配置文件(你把你的配置文件是写在项目之外的,放在你的主目录 ~ 下面的),也就是说,如果你的电脑主目录下存在配置文件,ESLint 不会去搜索到那儿,会自动忽略那里的配置文件。

扩展配置文件

这里所谓的扩展,实际上更准确的来讲,叫做继承。

{"extends": "eslint:recommended",
}

在上面的配置中,extends 对应的值为 eslint:recommended,表示采用 ESLint 团队推荐的规则规范。

在继承了 eslint:recommended 规则规范的基础上, 是可以进行额外的配置。

{"extends": "eslint:recommended","rules" : {"no-console": "warn"}
}

但是在进行原有配置规则的扩张的时候,有一个细节上面的问题:

{"extends": "eslint:recommended", // "eqeqeq": ["error", "allow-null"]"rules" : {"eqeqeq": "warn"}
}

在上面的扩展中,我们修改了 eqeqeq 这条规则的重要性,从 error 修改为了 warn,当你修改规则重要性的时候,原本的配置选项会保留,也就是说,上面关于 eqeqeq 这条规则,最终会变为

"eqeqeq": ["warn", "allow-null"]

但是如果你更改的是配置选项,那么则是完全覆盖。

{"extends": "eslint:recommended", // "quotes": ["error", "single", "avoid-escape"]"rules" : {"quotes": ["error", "double"]}
}

在上面的例子中,我们修改了 quotes 规则的配置选项,改为了 double,那么新的配置选项会对旧的(“single”, “avoid-escape”)进行完全覆盖。

另外关于 extends 对应的值还可以是一个数组:

{"extends": ["./node_modules/coding-standard/eslintDefaults.js","./node_modules/coding-standard/.eslintrc-es6","./node_modules/coding-standard/.eslintrc-jsx"],"rules": {"quotes": "warn"}
}

局部重写

有些时候,我们需要对配置进行更加精确的控制,例如都是在同一个目录下,不同的文件使用不同的配置,这种情况下就可以使用局部重写(overrides)

{"rules": {"quotes": ["error", "double"]},"overrides": [{"files": ["bin/*.js", "lib/*.js"],"excludedFiles": "*.test.js","rules": {"quotes": ["error", "single"]}}]
}

例如,假设我们有如下的项目结构:

any-project/
├── .eslintrc.js
├── lib/
│   ├── util.js
│   └── other.js
└── src/├── index.js└── main.js

在 .eslintrc.js 配置文件中,我们书写了如下的配置代码:

{"rules": {"quotes": ["error", "double"]},"overrides": [{"files": ["lib/*.js"],"rules": {"quotes": ["error", "single"]}}]
}

在上面的配置文件中,我们使用了局部重写,src 目录下面的所有 js 文件使用双引号,lib 目录下面所有的 js 文件使用单引号。

overrides 对应的值是一个数组,那么这意味着可以有多个配置项,当多个配置项之间匹配上了相同的文件,那么以后面的配置项为准。

{"rules": {"quotes": ["error", "double"]},"overrides": [{"files": ["**/*.js"],"rules": {"quotes": ["error", "single"]}},{"files": ["lib/*.js"],"rules": {"quotes": ["error", "double"]}}]
}

overrides 是支持嵌套,例如:

{"rules": {"quotes": ["error", "double"]},"overrides": [{"files": ["lib/*.js"],"rules": {"quotes": ["error", "single"]},"overrides": [{"files": ["util.js"],"rules": {"quotes": ["error", "double"]},}]}]
}

相关文章:

ESLint 配置文件全解析:格式、层叠与扩展(3)

配置文件系统处于一个更新期,存在两套配置文件系统,旧的配置文件系统适用于 v9.0.0 之前的版本,而新的配置文件系统适用于 v9.0.0之后的版本,但是目前还处于 v8.x.x 的大版本。 配置文件格式 在 ESLint 中,支持如下格…...

曲面单值化定理

曲面单值化定理(Uniformization Theorem)是复分析、几何和拓扑学中的一个重要结果。它为紧致黎曼曲面提供了标准化的几何结构,是研究复几何和代数几何的基础。以下是对曲面单值化定理的详细介绍以及其应用场景。 曲面单值化定理的陈述 基本版…...

数据预处理方法—数据增强、数据平衡

1.数据增强 1.1 原理 通过对数据进行变换增加数据的多样性,提高模型泛化能力,常用于图像和文本处理任务。 1.2 核心公式 例如:图像旋转: 其中,R()是旋转矩阵,是旋转角度。 1.3 Python案例 下面是一个…...

从扩散模型开始的生成模型范式演变--SDE

SDE是在分数生成模型的基础上,将加噪过程扩展时连续、无限状态,使得扩散模型的正向、逆向过程通过SDE表示。在前文讲解DDPM后,本文主要讲解SDE扩散模型原理。本文内容主要来自B站Up主deep_thoughts分享视频Score Diffusion Model分数扩散模型…...

基于Java Springboot 协同过滤算法音乐推荐系统

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue2、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA 数据库&#x…...

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势?

【NLP高频面题 - LLM架构篇】旋转位置编码RoPE相对正弦位置编码有哪些优势? 重要性:⭐⭐⭐ 💯 NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练…...

win10中使用ffmpeg的filter滤镜

1 给视频加文字水印 1.1 添加播放时间 ffmpeg -i input.mp4 -vf "drawtextfontfileC\\:/Windows/fonts/consola.ttf:fontsize30:fontcolorwhite:timecode00\:00\:00\:00:rate25:textTCR\::boxcolor0x000000AA:box1:x20:y20" -y output.mp4 在视频的x20:y20位置添加t…...

shell编程7,bash解释器的 for循环+while循环

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...

Flutter 1.2:flutter配置gradle环境

1、在android的模块中进行gradle环境配置 ①在 gradle-wrapper.properties文件中将url配置为阿里云镜像,因为gradle的服务器在国外,国内下载非常慢,也可在官网进行下载 gradle版本下载 gradle版本匹配 阿里云镜像gradle下载 可以通过复制链…...

LVS 负载均衡面试题及参考答案

目录 什么是 LVS 负载均衡?它的主要作用是什么? 为什么要使用 LVS 进行负载均衡? LVS 有哪些组成部分? 简述 LVS 的架构。 LVS 中有哪两种典型的架构?请简要说明它们的特点。 LVS 的工作原理是怎样的?简述 LVS 的工作原理。 解释 LVS 中的虚拟服务器(VS)概念。 …...

GaussDB(类似PostgreSQL)常用命令和注意事项

文章目录 前言GaussDB(类似PostgreSQL)常用命令和注意事项1. 连接到GaussDB数据库2. 查看当前数据库中的所有Schema3. 进入指定的Schema4. 查看Schema下的表、序列、视图5. 查看Schema下所有的表6. 查看表结构7. 开始事务8. 查询表字段注释9. 注意事项&a…...

c语言编程1.17蓝桥杯历届试题-回文数字

题目描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之…...

MVC core 传值session

MVC Entity Framework MVC Core session 》》 需要添加 Session 服务 和 Session中间件 builder.Services.AddSession(); app.UseSession(); 》》》控制器中 public IActionResult Privacy(){HttpContext.Session.SetString("key", "123");return View(…...

六:安装服务-compute node

一:工具、环境准备-controller node 二:OpenStack环境准备-controller node 三:安装服务-controller node 四:工具、环境准备-compute node 五:OpenStack环境准备-compute node 六:安装服务-compute node 七…...

【050】基于51单片机计步器【Keil程序+报告+原理图】

☆、设计硬件组成:51单片机最小系统ADXL345三轴加速度传感器LCD1602液晶显示AT24C02存储芯片按键控制。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,LCD1602实时显示; 2、设计采用ADXL345三轴加速度传感器实现对行走步…...

qt QGraphicsPolygonItem详解

1、概述 QGraphicsPolygonItem是Qt框架中QGraphicsItem的一个子类,它提供了一个可以添加到QGraphicsScene中的多边形项。通过QGraphicsPolygonItem,你可以定义和显示一个多边形,包括其填充颜色、边框样式等属性。QGraphicsPolygonItem支持各…...

OpenAI浅聊爬虫

前提 OpenAI越来越火,大有要干掉一片程序员的架势。在此,我们看看Sider(本文使用的OpenAI工具)对爬虫的看法。 爬虫的应用场景 爬虫技术(Web Scraping)有广泛的应用场景,以下是一些主要的应用…...

Java学习,ArrayList

ArrayList 是 Java 集合框架(Collections Framework)中的一个重要类,它实现了 List 接口。ArrayList 基于动态数组的数据结构,能够根据需要自动调整其大小。 关键特性 动态数组:ArrayList 底层使用数组来存储元素&…...

拓扑排序的两种实现

1 按节点结束时间进行排序 拓扑排序针对一张DAG,将所有节点按照结束时间从大到小依次排列。 算法描述为:初始化一个空链表 L L L,对DAG进行DFS,维护一个全局时钟 T T T,记录每个节点的开始时间(从白色变成…...

洛谷 P10491 [USACO09NOV] The Chivalrous Cow B C语言 bfs

题目: https://www.luogu.com.cn/problem/P10491?contestId217365 题目背景 农民 John 有很多牛,他想交易其中一头被 Don 称为 The Knight 的牛。这头牛有一个独一无二的超能力,在农场里像 Knight 一样地跳(就是我们熟悉的象棋…...

C语言——指针初阶(三)

目录 一.指针-指针 代码1: 运行结果: 代码2: 运行结果: 代码3: 运行结果: 二.指针数组 例: 往期回顾 一.指针-指针 指针减去指针的前提:两个指针指向同一块空间。 指针减去指针…...

【Spring】Spring IOCDI:架构旋律中的“依赖交响”与“控制华章”

前言 🌟🌟本期讲解关于Spring IOC&DI的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么…...

安全基线检查

一、安全基线检测基础知识 安全基线的定义 安全基线检查的内容 安全基线检查的操作 二、MySQL的安全基线检查 版本加固 弱口令 不存在匿名账户 合理设置权限 合理设置文件权限 日志审核 运行账号 可信ip地址控制 连接数限制 更严格的基线要求 1、禁止远程连接数据库 2、修改…...

python 生成tts语音

之前一直使用微软、或者国内大厂的接口,网页操作比较麻烦,最近发现一个python库可以完美解决,在这里分享给大家 在这里 GitHub - rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsof…...

【链表】【删除节点】【刷题笔记】【灵神题单】

237.删除链表的节点 链表删除节点的本质是不用删除,只需要操作指针,跳过需要删除的节点,指向下下一个节点即可! 删除某个节点,但是不知道这个节点的前一个节点,也不知道头节点!摘自力扣评论区…...

Keil 5, Flash Timeout. Reset the Target and try it again.

stm32F303RBT6 Flash Timeout. Reset the Target and try it again. 需要pack DFP 1.4.0, FLASH 烧写算法需要包括1.4.0...

如何估算自然对流传热系数

介绍 一般来说,对流可以定义为通过加热流体(例如空气或水)的运动来传递热量的过程。 自然对流(对流的一种特定类型)可以定义为流体在重力作用下由于较热因此密度较小的物质上升,而较冷且密度较大的物质下…...

uniapp中scrollview配合swiper实现一个简单的tab标签页

<template><view class"tab-container"><!-- Tab 标签滚动容器 --><scroll-view scroll-x"true" class"tab-scroll" scroll-with-animation"true"><view class"tab-list"><viewv-for"…...

Redis3——线程模型与数据结构

Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理&#xff0c;以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前&#xff0c;一个redis进程只有一个io线程&#xff0c;通过reactor模式可以连接大量客户端&#xff1b;redis6.0为了…...

JavaScript(JS)的对象

目录 1.array 数组对象 2.String 字符串对象 3.JSON 对象&#xff08;数据载体&#xff0c;进行数据传输&#xff09; 4.BOM 浏览器对象 5.DOM 文档对象&#xff08;了解&#xff09; 1.array 数组对象 定义方式1&#xff1a;var 变量名 new Array(元素列表); 定义方式…...

计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

二阶信息在机器学习中的优化;GPTQ算法利用近似二阶信息;为什么要求近似二阶(运算量大,ReLu0点不可微)

目录 二阶信息在机器学习中的优化 GPTQ算法利用近似二阶信息来找到合适的量化权重 详细解释 举例说明 近似二阶信息 定义与解释 举例说明 总结 为什么要求近似二阶(运算量大,ReLu0点不可微) 计算复杂性 精度需求 实际应用场景中的权衡 二阶信息在机器学习中的优…...

Spring事务管理学习记录

一、概念 事务&#xff08;Transaction&#xff09;是指一组操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败。事务的四大特性&#xff08;ACID&#xff09;确保了数据的完整性和一致性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a…...

Linux locate 命令详解

简介 locate 命令用于通过查询预构建的数据库来快速搜索文件和目录&#xff0c;该数据库包含来自文件系统的索引文件路径。它比 find 之类的命令要快得多&#xff0c;因为它不会实时搜索整个文件系统。 关键概念 locate 命令依赖于数据库&#xff0c;通常位于 /var/lib/mloca…...

uniapp手机端一些坑记录

关于 z-paging-x 组件&#xff0c;在ios上有时候通过弹窗去粗发它reload时会触发闪退&#xff0c;可能是弹框插入进去导致的DOM 元素已经被移除或者不可用&#xff0c;解决办法是加上他自带属性 :showRefresherWhenReload"true" 加上showRefresherWhe…...

快速排序算法

快速排序是一种非常高效的排序算法&#xff0c;采用分治策略来对一个数组进行排序。它由C. A. R. Hoare在1960年提出。快速排序的基本思想是通过一趟排序将待排记录分割成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分的关键字小&#xff0c;然后分别对这两部分…...

CSS定位

定位 其中&#xff0c;绝对定位和固定定位会脱离文档流 设置定位之后&#xff1a;可以使用四个方向值进行调整位置&#xff1a;left、top、right、bottom 相对定位 温馨提示 设置定位之后&#xff0c;相对定位和绝对定位他是相对于具有定位的父级元素进行位置调整&#xff0c…...

追加docker已运行容器添加或修改端口映射方法

docker run可以指定端口映射 【】docker run -d -p 80:80 --name name 但是容器一旦生成&#xff0c;就没有一个命令可以直接修改。通常间接的办法是&#xff0c;保存镜像&#xff0c;再创建一个新的容器&#xff0c;在创建时指定新的端口映射。 【】 docker stop A 【】 doc…...

53 基于单片机的8路抢答器加记分

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 首先有三个按键 分别为开始 暂停 复位&#xff0c;然后八个选手按键&#xff0c;开机显示四条杠&#xff0c;然后按一号选手按键&#xff0c;数码管显示&#xff13;&#xff10;&#xff0c;这…...

ubuntu多版本安装gcc

1.ubuntu安装gcc 9.3.1 $ sudo apt update $ sudo apt install gcc-9 g-9 二、配置GCC版本 安装完成后&#xff0c;需要使用update-alternatives命令来配置GCC版本。这个命令允许系统在多个安装的版本之间进行选择 1.添加GCC 9.3.1到update-alternatives管理 $ sudo update-a…...

异步处理优化:多线程线程池与消息队列的选择与应用

目录 一、异步处理方式引入 &#xff08;一&#xff09;异步业务识别 &#xff08;二&#xff09;明确异步处理方式 二、多线程线程池&#xff08;Thread Pool&#xff09; &#xff08;一&#xff09;工作原理 &#xff08;二&#xff09;直面优缺点和适用场景 1.需要快…...

音视频技术扫盲之预测编码的基本原理探究

预测编码是一种数据压缩技术&#xff0c;广泛应用于图像、视频和音频编码等领域。其基本原理是利用数据的相关性&#xff0c;通过对当前数据的预测和实际值与预测值之间的差值进行编码&#xff0c;从而实现数据压缩的目的。 一、预测编码的基本概念 预测编码主要包括预测器和…...

计算机毕业设计SpringCloud+大模型微服务高考志愿填报推荐系统 高考大数据 SparkML机器学习 深度学习 人工智能 Python爬虫 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

AIGC训练效率与模型优化的深入探讨

文章目录 1.AIGC概述2.AIGC模型训练效率的重要性3.模型优化的概念与目标4.模型优化策略4.1 学习率调节4.2 模型架构选择4.3 数据预处理与增强4.4 正则化技术4.5 量化与剪枝 5.代码示例6.结论 人工智能领域的发展&#xff0c;人工智能生成内容&#xff08; AIGC&#xff09;越来…...

《深入浅出HTTPS》读书笔记(13):块密码算法之迭代模式(续)

CTR模式 每次迭代运算的时候要生成一个密钥流&#xff08;keystream&#xff09;。 各个密钥流之间是有关系的&#xff0c;最简单的方式就是密钥流不断递增&#xff0c;所以才叫作计数器模式。 ◎在处理迭代之前&#xff0c;先生成每个密钥流&#xff0c;有n个数据块&#xff0…...

定时任务删除MongoDB历史数据

前言 MongoDB数据过多&#xff0c;导致存储成本飙升&#xff0c;为了降低成本&#xff0c;需要将历史数据删除。 删除逻辑 添加配置文件控制删除逻辑 syncconfig:deleteMongoConfig:#同步状态&#xff0c;true同步&#xff0c;false不同步syncStatus: true#删除数据的时间&…...

Simulink的SIL软件在环测试

以基于模型的设计&#xff08;MBD&#xff09;的软件开发时&#xff0c;需要进行SIL&#xff08;软件在环测试&#xff09;。SIL测试就是在PC上验证模型是否与代码功能一致。在项目开展中&#xff0c;用在需要将控制器生成移植到硬件前&#xff0c;把控制器的模块生成代码&…...

你能穿过迷雾看清一切吗

很多事情的真相有谁知道&#xff1f; 我和家里人被看不见的攻击攻击和操控&#xff0c;失控和无助状态被假鬼录制&#xff0c;然后安排某些不知道整个实际情况和真相的人去听&#xff0c;间接歪曲了整件事情。 各种高科技配合和各种脑功能操控伤害是一般人想都想不到的&#…...

8 设计模式之简单工厂模式

设计模式是软件开发中的一套通用解决方案&#xff0c;而简单工厂模式则是最基础、最常用的一种创建型模式。在这篇博客中&#xff0c;我将为大家详细介绍简单工厂模式的概念、优缺点&#xff0c;以及通过一个饮料制作的案例&#xff0c;帮助大家更好地理解和应用这种模式。 一、…...

一步一步写线程之十六线程的安全退出之一理论分析

一、多线程的开发 多线程的开发&#xff0c;在实际场景中几乎是无法避开的。即使是前端看似没有使用线程&#xff0c;其实在底层的框架中也使用了线程进行了支撑。至少到现在&#xff0c;不管是协程还是其它什么新的编程方式&#xff0c;仍然无法撼动线程的主流地位。 多线程的…...