版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
前端ESLint插件规范书一、ESLint插件基础认知1.1ESLint插件的定义与价值ESLint是一款开源的JavaScript代码检查工具,通过自定义规则来约束代码风格、发现潜在bug,而ESLint插件则是扩展其功能的核心载体。插件本质上是一个包含自定义规则、配置、处理器等元素的npm包,能够让开发者根据项目需求、团队编码习惯或特定技术栈,灵活扩展ESLint的检查能力。在现代前端开发中,ESLint插件的价值体现在多个维度。首先,它能够实现代码风格的统一化管理,尤其是在多人协作的大型项目中,通过插件定义的规则,确保所有开发者的代码在缩进、变量命名、语句格式等方面保持一致,降低代码维护成本。其次,插件可以提前发现代码中的潜在问题,比如未定义变量、不合理的类型转换、异步操作错误处理缺失等,在代码提交前就将这些问题暴露出来,避免其进入生产环境引发故障。此外,针对React、Vue、TypeScript等特定技术栈,社区已经开发了大量成熟的ESLint插件,如eslint-plugin-react、eslint-plugin-vue,这些插件能够深度适配框架特性,提供更贴合技术栈的代码检查规则。1.2ESLint插件的核心组成一个标准的ESLint插件通常由规则(Rules)、配置(Configs)、处理器(Processors)和环境(Environments)四个核心部分组成。规则(Rules)是插件的核心,每个规则对应一个具体的代码检查逻辑。规则可以分为三类:“问题类规则”用于发现代码中的错误或潜在bug,比如禁止使用未定义的变量;“风格类规则”用于统一代码风格,比如强制使用单引号还是双引号;“最佳实践类规则”用于引导开发者遵循行业公认的最佳实践,比如避免在循环中创建函数。每个规则都可以配置不同的级别,包括“off”(关闭规则)、“warn”(触发警告)和“error”(触发错误),开发者可以根据项目需求灵活调整。配置(Configs)是规则的集合,通过配置可以快速为项目启用一组规则。插件中通常会提供多种预设配置,比如recommended配置包含了经过社区验证的常用规则,all配置则启用插件中的所有规则。开发者可以直接使用这些预设配置,也可以在其基础上进行自定义修改,添加或移除特定规则,调整规则的级别和选项。处理器(Processors)用于处理非JavaScript文件,比如Vue单文件组件(.vue)、React的JSX文件等。处理器能够将这些非标准文件转换为ESLint可以识别的JavaScript代码,然后再应用规则进行检查。例如,eslint-plugin-vue中的处理器可以解析.vue文件中的<script>标签内容,并将其转换为JavaScript代码进行检查,同时还能处理模板部分的特定规则。环境(Environments)用于定义代码运行的环境,不同的环境会预设不同的全局变量。比如在浏览器环境中,会自动识别window、document等全局变量;在Node.js环境中,会识别require、module等全局变量。插件可以通过定义环境,让ESLint在检查代码时正确识别这些全局变量,避免误报“未定义变量”的错误。二、ESLint插件开发规范2.1项目结构与文件组织开发ESLint插件时,合理的项目结构是保证代码可维护性的基础。一个标准的ESLint插件项目通常包含以下文件和目录:eslint-plugin-custom/├──lib/│├──rules/#存放所有自定义规则││├──no-undef-var.js││└──prefer-arrow-function.js│├──configs/#存放预设配置││├──recommended.js││└──all.js│├──processors/#存放处理器(如有需要)││└──vue-processor.js│└──index.js#插件入口文件├──tests/#测试文件目录│├──rules/││├──no-undef-var.test.js││└──prefer-arrow-function.test.js│└──configs/│└──recommended.test.js├──README.md#插件说明文档├──package.json#npm包配置文件└──.eslintrc.js#插件自身的ESLint配置lib/rules目录是所有自定义规则的存放位置,每个规则对应一个独立的JavaScript文件。文件名应清晰反映规则的功能,比如no-undef-var.js表示禁止使用未定义的变量,prefer-arrow-function.js表示优先使用箭头函数。lib/configs目录用于存放预设配置文件,每个配置文件导出一个包含rules、env、parserOptions等属性的对象。例如,recommended.js配置文件可以启用插件中的核心规则,并设置合理的默认级别。lib/index.js是插件的入口文件,需要导出一个包含rules、configs、processors等属性的对象,将插件的各个组成部分暴露给ESLint。示例代码如下:module.exports={rules:{'no-undef-var':require('./rules/no-undef-var'),'prefer-arrow-function':require('./rules/prefer-arrow-function')},configs:{recommended:require('./configs/recommended'),all:require('./configs/all')},processors:{'.vue':require('./processors/vue-processor')}};tests目录用于存放规则和配置的测试文件,每个规则都应该有对应的测试用例,确保规则的正确性。测试通常使用ESLint提供的RuleTester工具,编写符合规则和违反规则的代码示例,验证规则是否能够正确触发警告或错误。2.2自定义规则开发规范自定义规则是ESLint插件开发的核心,开发规则时需要遵循一系列规范,确保规则的正确性、可维护性和易用性。2.2.1规则命名规范规则名称应清晰、准确地反映规则的功能,采用小写字母、连字符分隔的命名方式。命名通常遵循以下几种模式:禁止类规则:以no-开头,比如no-undef-var(禁止未定义变量)、no-console(禁止使用console)。强制类规则:以require-开头,比如require-await(强制异步函数使用await)、return-await(强制在返回异步结果时使用await)。偏好类规则:以prefer-开头,比如prefer-arrow-function(优先使用箭头函数)、prefer-const(优先使用const声明变量)。风格类规则:直接描述风格要求,比如indent(缩进规则)、quotes(引号规则)。2.2.2规则实现规范规则的实现主要依赖于ESLint提供的AST(抽象语法树)遍历API。ESLint会将JavaScript代码解析为AST,然后开发者可以通过选择器(Selector)定位到AST中的特定节点,对节点进行检查并报告问题。一个完整的规则通常包含create函数,该函数返回一个对象,对象的属性是AST节点类型或选择器,值是对应的处理函数。示例代码如下:module.exports={meta:{type:'problem',docs:{description:'禁止使用未定义的变量',recommended:true},fixable:null,schema:[]},create(context){return{Identifier(node){constscope=context.getScope();constvariable=scope.set.get();if(!variable||variable.defs.length===0){context.report({node,message:'未定义的变量:{{name}}',data:{name:}});}}};}};在规则实现中,meta对象用于定义规则的元数据,包括规则类型(type)、文档描述(docs)、是否可自动修复(fixable)和配置schema(schema)。create函数中的context对象提供了一系列API,用于获取代码上下文、报告问题、修复代码等。开发规则时,需要注意以下几点:性能优化:避免在处理函数中进行复杂的计算或深度遍历,尤其是在处理大型代码文件时,性能问题可能会导致ESLint检查速度大幅下降。可以通过缓存计算结果、优化选择器等方式提升性能。错误信息清晰:报告问题时,错误信息应简洁明了,准确描述问题所在,并提供足够的上下文信息,帮助开发者快速定位和修复问题。支持自动修复:对于一些规则,比如代码风格类规则,可以实现自动修复功能,让ESLint直接修改代码来符合规则要求。自动修复通过context.report方法的fix选项实现,示例代码如下:context.report({node,message:'应使用单引号',fix(fixer){returnfixer.replaceText(node,`'${node.value}'`);}});2.2.3规则测试规范每个自定义规则都应该编写全面的测试用例,确保规则的正确性。测试使用ESLint提供的RuleTester工具,编写符合规则和违反规则的代码示例,验证规则是否能够正确触发警告或错误。测试用例通常分为valid(符合规则的代码)和invalid(违反规则的代码)两部分。示例代码如下:const{RuleTester}=require('eslint');construle=require('../lib/rules/no-undef-var');construleTester=newRuleTester({parserOptions:{ecmaVersion:2020}});ruleTester.run('no-undef-var',rule,{valid:['consta=1;console.log(a);','functionfoo(){constb=2;returnb;}'],invalid:[{code:'console.log(c);',errors:[{message:'未定义的变量:c'}]},{code:'functionbar(){returnd;}',errors:[{message:'未定义的变量:d'}]}]});测试用例应覆盖规则的所有边界情况,比如不同的代码结构、不同的ECMAScript版本、不同的环境变量等。此外,对于支持自动修复的规则,还需要编写测试用例验证修复后的代码是否符合规则要求。2.3配置与处理器开发规范2.3.1配置开发规范配置是规则的集合,开发配置时需要遵循以下规范:预设配置分类清晰:插件应提供recommended、all等预设配置,recommended配置包含经过社区验证的常用规则,设置为error或warn级别;all配置启用插件中的所有规则,方便开发者根据项目需求进行裁剪。配置可扩展性强:预设配置应允许开发者在其基础上进行自定义修改,比如添加或移除特定规则,调整规则的级别和选项。在配置文件中,应使用extends属性继承其他配置,使用rules属性覆盖或添加规则。配置文档完善:每个预设配置都应在README文档中详细说明包含的规则、适用场景和配置方式,帮助开发者快速了解配置的用途。示例recommended配置文件代码如下:module.exports={rules:{'custom/no-undef-var':'error','custom/prefer-arrow-function':'warn','custom/require-await':'error'}};2.3.2处理器开发规范处理器主要用于处理非JavaScript文件,开发处理器时需要遵循以下规范:专注于文件转换:处理器的核心职责是将非JavaScript文件转换为ESLint可以识别的JavaScript代码,不应包含复杂的业务逻辑。转换过程中应尽量保留代码的原始结构和位置信息,方便ESLint准确报告问题的行号和列号。适配多种文件类型:处理器可以通过文件扩展名来匹配不同的文件类型,比如.vue、.jsx、.tsx等。在处理器中,应根据文件类型选择合适的解析方式,比如对于Vue单文件组件,需要解析<script>标签中的JavaScript代码,同时处理模板部分的特定规则。性能优化:处理大型文件时,处理器的性能直接影响ESLint的检查速度。应避免在处理器中进行不必要的计算或重复解析,尽量使用缓存机制提升性能。示例Vue处理器代码如下:module.exports={preprocess(text,filename){//解析.vue文件,提取<script>标签中的JavaScript代码constscriptMatch=text.match(/<script[^>]*>([\s\S]*?)<\/script>/);if(scriptMatch){return[scriptMatch[1]];}return[''];},postprocess(messages,filename){//调整错误信息的位置,匹配原始文件的行号returnmessages[0].map(message=>{//计算<script>标签在原始文件中的起始行号constscriptStartLine=text.slice(0,scriptMatch.index).split('\n').length;return{...message,line:message.line+scriptStartLine-1};});}};三、ESLint插件使用规范3.1插件安装与配置在项目中使用ESLint插件,首先需要通过npm或yarn安装插件及其依赖。以eslint-plugin-react为例,安装命令如下:npminstalleslinteslint-plugin-react--save-dev安装完成后,需要在ESLint配置文件(通常是.eslintrc.js或.eslintrc.json)中配置插件。配置主要包括以下几个步骤:启用插件:在配置文件的plugins数组中添加插件名称,插件名称通常省略eslint-plugin-前缀,比如react对应eslint-plugin-react。继承预设配置:在extends数组中添加插件提供的预设配置,比如plugin:react/recommended,快速启用插件的常用规则。自定义规则:在rules对象中添加或修改特定规则的级别和选项,根据项目需求进行个性化配置。示例配置文件代码如下:module.exports={env:{browser:true,es2021:true},extends:['eslint:recommended','plugin:react/recommended'],parserOptions:{ecmaFeatures:{jsx:true},ecmaVersion:'latest',sourceType:'module'},plugins:['react'],rules:{'react/react-in-jsx-scope':'off',//关闭React必须在JSX作用域中的规则(React17+无需导入React)'react/prop-types':'warn',//将prop-types规则设置为警告级别'indent':['error',2],//强制使用2空格缩进'quotes':['error','single']//强制使用单引号}};3.2插件与项目技术栈适配不同的前端技术栈需要使用不同的ESLint插件,插件的选择和配置应与项目技术栈深度适配。3.2.1React项目适配React项目通常使用eslint-plugin-react和eslint-plugin-react-hooks插件。eslint-plugin-react提供了针对React组件的代码检查规则,比如组件命名规范、props类型检查、JSX语法规范等;eslint-plugin-react-hooks则专注于ReactHooks的规则检查,比如useEffect的依赖项管理、Hooks的调用顺序等。在React17及以上版本中,由于JSX转换不再需要导入React,因此可以关闭react/react-in-jsx-scope规则。此外,结合TypeScript使用时,还可以使用@typescript-eslint/eslint-plugin插件,提供TypeScript语法的代码检查规则。3.2.2Vue项目适配Vue项目通常使用eslint-plugin-vue插件,该插件深度适配Vue2和Vue3的特性,提供了针对Vue单文件组件的代码检查规则,比如模板语法规范、组件属性顺序、生命周期钩子函数使用规范等。eslint-plugin-vue提供了多种预设配置,比如plugin:vue/vue3-recommended(适用于Vue3项目)、plugin:vue/vue2-recommended(适用于Vue2项目)。在配置时,需要根据Vue版本选择合适的预设配置,并结合项目需求进行自定义调整。3.2.3TypeScript项目适配TypeScript项目通常使用@typescript-eslint/eslint-plugin插件,该插件提供了针对TypeScript语法的代码检查规则,比如类型定义规范、接口使用规范、类型转换规范等。使用@typescript-eslint/eslint-plugin时,需要配合@typescript-eslint/parser解析器,将TypeScript代码解析为ESLint可以识别的AST。配置示例如下:module.exports={parser:'@typescript-eslint/parser',plugins:['@typescript-eslint'],extends:['eslint:recommended','plugin:@typescript-eslint/recommended'],rules:{'@typescript-eslint/no-unused-vars':'error','@typescript-eslint/explicit-function-return-type':'warn'}};3.3插件集成与自动化流程为了充分发挥ESLint插件的作用,需要将其集成到项目的开发流程中,实现代码检查的自动化。3.3.1本地开发阶段集成在本地开发阶段,可以通过以下方式集成ESLint插件:编辑器集成:在VSCode、WebStorm等编辑器中安装ESLint插件,编辑器会实时检查代码,在违反规则的代码位置显示警告或错误提示,并提供快速修复选项。比如在VSCode中,安装ESLint插件后,开启eslint.autoFixOnSave配置,即可在保存代码时自动修复符合规则的问题。命令行检查:在项目的package.json中添加lint脚本,运行npmrunlint命令即可对项目中的所有代码进行检查。示例脚本如下:{"scripts":{"lint":"eslintsrc/**/*.jssrc/**/*.jsx","lint:fix":"eslintsrc/**/*.jssrc/**/*.jsx--fix"}}lint:fix命令可以自动修复一些可修复的规则问题,比如代码缩进、引号转换等。3.3.2CI/CD流程集成在CI/CD(持续集成/持续部署)流程中集成ESLint插件,确保只有通过代码检查的代码才能进入后续的构建和部署阶段。常见的集成方式包括:GitHubActions:在项目的.github/workflows目录中创建CI配置文件,添加ESLint检查步骤。示例配置如下:name:ESLintCheckon:[push,pull_request]jobs:lint:runs-on:ubuntu-lateststeps:-uses:actions/checkout@v4-name:SetupNode.jsuses:actions/setup-node@v4with:node-version:'20'-name:Installdependenciesrun:npminstall-name:RunESLintrun:npmrunlintGitLabCI:在项目的.gitlab-ci.yml文件中添加ESLint检查阶段。示例配置如下:lint:stage:testimage:node:20script:-npminstall-npmrunlintonly:-pushes-merge_requests通过在CI/CD流程中集成ESLint插件,可以有效避免不符合规范的代码进入生产环境,保证代码质量的一致性。四、ESLint插件社区贡献规范4.1社区插件贡献流程ESLint拥有活跃的社区生态,开发者可以通过贡献插件、规则或改进现有插件来参与社区建设。社区贡献通常遵循以下流程:需求调研:在贡献前,首先需要调研社区是否已经存在类似的插件或规则,避免重复开发。可以通过ESLint官方文档、npm仓库、GitHubIssues等渠道进行调研。如果发现已有类似插件,可以考虑在其基础上进行改进,或者提出新的功能需求。开发与测试:确定贡献方向后,按照前文所述的ESLint插件开发规范进行开发,编写完善的测试用例,确保插件或规则的正确性和稳定性。文档编写:编写清晰、详细的文档,包括插件的安装方法、配置方式、规则说明、使用示例等。文档是用户了解和使用插件的重要依据,应尽量做到简洁明了、易于理解。提交PR:将插件或规则提交到对应的GitHub仓库,提交PR(PullRequest)时,需要提供详细的描述,说明贡献的内容、解决的问题、测试情况等。同时,需要遵循仓库的贡献指南,比如代码风格、提交信息规范等。代码审查与合并:社区维护者会对PR进行代码审查,提出改进意见。开发者需要根据审查意见修改代码,直到PR通过审查并被合并到主仓库。4.2社区插件维护规范对于已经发布到社区的ESLint插件,需要进行持续维护,确保插件的稳定性和兼容性。版本管理:遵循语义化版本(SemanticVersioning)规范,版本号分为主版本号(MAJOR)、次版本号(MINOR)和修订号(PATCH)。主版本号更新表示插件有不兼容的API变更,次版本号更新表示添加了新功能,修订号更新表示修复了bug。兼容性维护:及时跟进ESLint、React、Vue、TypeScript等依赖库的版本更新,确保插件与最新版本的依赖库兼容。当依赖库出现重大版本更新时,需要对插件进行适配,修改不兼容的代码。问题处理:定期查看GitHubIssues和PullRequests,及时处理用户反馈的问题和需求。对于用户提出的bug,需要尽快修复并发布新版本;对于用户提出的新功能需求,需要评估其合理性和可行性,决定是否纳入插件的开发计划。文档更新:随着插件的版本更新,需要及时更新文档,反映插件的新功能、新规则和变更内容。确保文档与插件的实际功能保持一致,避免用户因文档过时而产生误解。4.3社区插件质量评估在选择社区插件时,需要从多个维度评估插件的质量,确保插件能够满足项目需求。活跃度:查看插件的GitHub仓库的提交频率、Issues处理速度、PullRequests合并情况等指标,评估插件的维护活跃度。活跃度高的插件通常能够及时修复bug、适配新的技术栈版本。下载量与星标数:查看插件在npm仓库的下载量和GitHub仓库的星标数,这些指标可以反映插件的受欢迎程度和社区认可度。下载量高、星标数多的插件通常经过了大量用户的验证,质量更有保障。规则数量与覆盖范围:查看插件提供的规则数量和覆盖范围,评估插件是否能够满足项目的代码检查需求。对于特定技术栈的插件,需要确保其规则能够深度适配技术栈的特性。文档质量:查看插件的文档是否清晰、详细,是否包含安装方法、配置方式、规则说明、使用示例等内容。优质的文档能够帮助开发者快速上手使用插件,减少学习成本。兼容性:查看插件的依赖库版本要求,评估插件是否与项目中使用的依赖库版本兼容。如果插件依赖的ESLint版本与项目中的ESLint版本不兼容,可能会导致代码检查失败或出现异常。五、ESLint插件常见问题与解决方案5.1规则误报与漏报问题在使用ESLint插件的过程中,可能会遇到规则误报(将符合规范的代码判定为违反规则)或漏报(将违反规则的代码判定为符合规范)的问题。常见原因和解决方案如下:5.1.1规则配置不当规则配置不当是导致误报和漏报的常见原因。比如,规则的级别设置过高或过低,规则的选项配置不符合项目需求,或者规则与项目使用的技术栈不兼容。解决方案:仔细查看规则的文档,了解规则的功能和配置选项,根据项目需求调整规则的级别和选项。如果规则与技术栈不兼容,可以考虑关闭该规则,或者寻找更适合技术栈的替代规则。5.1.2AST解析问题ESLint通过解析AST来检查代码,如果代码中包含一些特殊的语法或非标准的写法,可能会导致AST解析错误,从而引发规则误报或漏报。比如,使用了尚未被ESLint解析器支持的ECMAScript新语法,或者代码中包含了动态生成的内容。解决方案:更新ESLint解析器到最新版本,确保解析器支持项目中使用的ECMAScript语法。对于动态生成的内容,可以通过ESLint的/*eslint-disable*/和/*eslint-enable*/注释临时禁用规则,或者使用eslint-ignore注释忽略特定行的代码检查。5.1.3规则实现缺陷部分规则可能存在实现缺陷,导致误报或漏报。比如,规则的AST选择器定位不准确,或者规则的检查逻辑存在漏洞。解决方案:在插件的GitHub仓库中搜索相关的Issues,查看是否有其他用户遇到了类似的问题。如果是已知问题,可以等待插件维护者修复;如果是新问题,可以提交Issue并提供详细的代码示例,帮助维护者定位和修复问题。同时,可以暂时关闭该规则,或者使用自定义规则替代。5.2性能问题在大型项目中,ESLint插件的代码检查可能会出现性能问题,导致检查速度过慢,影响开发效率。常见原因和解决方案如下:5.2.1规则数量过多启用的规则数量过多会增加ESLint的检查时间,尤其是一些复杂的规则,需要进行大量的AST遍历和计算。解决方案:根据项目需求,合理选择启用的规则,避免启用不必要的规则。可以使用插件提供的recommended预设配置,该配置包含了常用的规则,同时避免了一些性能开销较大的规则。此外,可以通过eslint-plugin-eslint-plugin等工具分析规则的性能开销,找出性能瓶颈并进行优化。5.2.2代码文件过大大型代码文件会增加ESLint的解析和检查时间,尤其是包含大量复杂逻辑的文件。解决方案:将大型代码文件拆分为多个小文件,降低单个文件的复杂度。同时,可以使用ESLint的--cache选项启用缓存功能,只检查修改过的文件,减少重复检查的时间。示例命令如下:eslintsrc/**/*.js--cache5.2.3插件版本过旧旧版本的ESLint插件可能存在性能问题,随着插件版本的更新,维护者通常会对规则的性能进行优化。解决方案:定期更新ESLint插件到最新版本,享受版本更新带来的性能提升。在更新插件前,需要仔细查看插件的变更日志,了解版本更新的内容和可能的兼容性问题。5.3集成问题在将ESLint插件集成到项目开发流程或CI/CD流程中时,可能会遇到各种集成问题。常见问题和解决方案如下:5.3.1编辑器集成问题编辑器集成ESLint插件后,可能会出现代码检查不生效、错误提示不准确或快速修复功能无法使用等问题。解决方案:检查编辑器的ESLint插件配置,确保配置正确。比如,在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 能源行业研发部门新能源技术绩效衡量表
- 冷库企业安全管理员装卸作业安全操作规程
- 食品流通企业电工定期维护安全操作规程
- 警惕安全隐患,平安快乐每一天,小学主题班会课件
- 珠宝鉴定评价表
- 公关人员危机公关应对标准指导书
- 初级消防设施操作员试题库及答案
- 电商平台客服话术标准化与服务提升指导书
- 征信公司火灾应急预案演练脚本
- 旅行背包轻量化打包技巧手册
- 教学课件道德与法治部编版(2024版)七年级初一上册4.2让家更美好课件01
- 2024年可行性研究报告投资估算及财务分析全套计算表格(含附表-带只更改标红部分-操作简单)
- 《贵州省水利水电工程系列概(估)算编制规定》(2022版 )
- 电动汽车充电桩安装检修赛项考试题库500题(含答案)
- GA/T 2131-2024移民管理领域标准体系表
- YBT 4334-2024《金属箔材 室温拉伸试验方法》
- GB/T 27692-2024高炉用铁球团矿
- 数字经济导论 课件全套 第1-14章 数字经济概述-重点领域的数字经济政策
- Weiss′s 功能性缺陷程度(父母问卷)
- 灰岩地区长大隧道机械化快速施工技术
- (完整)注册安全工程师考试题库(含答案)
评论
0/150
提交评论