面试题答案
一键面试module
- 作用:指定编译后使用的模块系统。常见取值有
commonjs
、amd
、umd
、es6
(或es2015
)、es2020
、esnext
等。commonjs
:用于Node.js环境,模块通过exports
或module.exports
导出,通过require
导入。amd
:主要用于浏览器端异步模块定义,通过define
函数来定义和加载模块。umd
:通用模块定义,既可以在Node.js环境运行,也可以在浏览器中使用,兼容commonjs
和amd
。es6
(或es2015
)、es2020
、esnext
:使用ECMAScript标准的模块系统,通过export
和import
语句进行导出和导入。
- 不同项目场景选择:
- Node.js项目:通常选择
commonjs
,因为Node.js原生支持这种模块系统,能保证最佳兼容性和性能。 - 浏览器端项目(无打包工具):如果项目不使用打包工具,且希望在浏览器中直接运行模块,可以考虑
amd
或umd
,umd
更通用。 - 现代前端项目(使用打包工具如Webpack、Rollup等):一般选择
es6
(或es2015
)及以上,因为打包工具能很好地处理ES模块,而且ES模块语法更简洁,利于代码的组织和维护。
- Node.js项目:通常选择
moduleResolution
- 作用:指定模块解析策略。常见取值有
node
、classic
。node
:采用Node.js的模块解析策略。对于相对路径导入,按照文件系统路径查找;对于非相对路径导入(如包名),先在node_modules
目录查找。classic
:较旧的解析策略,不遵循Node.js的解析规则,按照较简单的规则查找模块,在现代项目中较少使用。
- 不同项目场景选择:
- Node.js项目或使用Node.js模块解析习惯的项目:选择
node
,这样能与Node.js的模块查找机制一致,方便导入第三方模块和自定义模块。 - 不依赖Node.js模块解析机制的特殊项目:如果项目有特殊的模块组织方式,不希望遵循Node.js的解析规则,可以考虑
classic
,但这种情况比较少见。
- Node.js项目或使用Node.js模块解析习惯的项目:选择
baseUrl
- 作用:指定模块导入的基础路径。当设置了
baseUrl
后,非相对路径的模块导入将相对于这个基础路径进行解析。 - 不同项目场景选择:
- 大型项目有复杂模块结构:在大型项目中,如果模块结构复杂,通过设置
baseUrl
可以简化模块导入路径。例如项目结构为src/utils/user.js
,src/views/home.js
,在home.js
中导入user.js
时,若设置baseUrl
为src
,则可以写成import { userFunction } from 'utils/user'
,而不是相对路径import { userFunction } from '../utils/user'
,使代码更简洁,且在项目结构调整时,修改baseUrl
比修改大量相对路径更方便。
- 大型项目有复杂模块结构:在大型项目中,如果模块结构复杂,通过设置
paths
- 作用:用于设置模块名到实际路径的映射。可以将特定模块名映射到自定义的路径,类似于别名。
- 不同项目场景选择:
- 项目中有常用模块需简化导入:例如项目中有一个常用的工具库模块位于
src/libs/utils
,每次导入都写相对路径很繁琐,通过paths
配置可以将@utils
映射到src/libs/utils
,在代码中就可以通过import { utilFunction } from '@utils'
进行导入,提高开发效率。同时,当模块实际路径发生变化时,只需修改paths
配置,而不用修改所有导入语句。
- 项目中有常用模块需简化导入:例如项目中有一个常用的工具库模块位于
rootDirs
- 作用:允许指定多个目录作为项目的根目录。在编译时,TypeScript会将这些目录视为一个虚拟的根目录,有助于处理复杂的项目结构,如在一个项目中同时存在
src
和test
目录,且希望它们都能作为根目录来解析模块。 - 不同项目场景选择:
- 项目有多个平行的模块根目录:当项目中有不同类型的代码(如生产代码和测试代码)分别放在不同目录,但又希望它们在模块解析上有平等的地位时,使用
rootDirs
。例如src
目录存放生产代码,test
目录存放测试代码,通过设置rootDirs: ["src", "test"]
,在测试代码中导入生产代码模块时,可以像它们在同一根目录下一样进行导入,简化导入路径,同时保持项目结构的清晰。
- 项目有多个平行的模块根目录:当项目中有不同类型的代码(如生产代码和测试代码)分别放在不同目录,但又希望它们在模块解析上有平等的地位时,使用