内容简介:继续上文[使用baseUrl是使用AMD模块加载器的应用程序中的常见做法,其中模块在运行时"deployed"到单个文件夹。这些模块的源代码可以存在于不同的目录中,但构建脚本会将它们放在一起。
继续上文[ TypeScript基础入门之模块解析(一) ]
模块解析
Base URL
使用baseUrl是使用AMD模块加载器的应用程序中的常见做法,其中模块在运行时"deployed"到单个文件夹。
这些模块的源代码可以存在于不同的目录中,但构建脚本会将它们放在一起。
设置baseUrl通知编译器在哪里可以找到模块。
假定所有具有非相对名称的模块导入都相对于baseUrl
baseUrl的值确定为:
1) baseUrl命令行参数的值(如果给定的路径是相对的,则根据当前目录计算)
2) 'tsconfig.json'中baseUrl属性的值(如果给定的路径是相对的,则根据'tsconfig.json'的位置计算)
请注意,设置baseUrl不会影响相对模块导入,因为它们始终相对于导入文件进行解析。
您可以在RequireJS和SystemJS文档中找到有关baseUrl的更多文档。
路径映射(Path mapping)
有时模块不直接位于baseUrl下。
例如,对模块"jquery"的导入将在运行时转换为"node_modules/jquery/dist/jquery.slim.min.js"。
加载程序使用映射配置在运行时将模块名称映射到文件,请参阅RequireJs文档和SystemJS文档
TypeScript编译器支持使用tsconfig.json文件中的"paths"属性声明此类映射。
以下是如何为jquery指定"paths"属性的示例。
{ "compilerOptions": { "baseUrl": ".", // This must be specified if "paths" is. "paths": { "jquery": ["node_modules/jquery/dist/jquery"] // This mapping is relative to "baseUrl" } } }
请注意,相对于"baseUrl"解析"paths"。
当将"baseUrl"设置为"."之外的另一个值,即tsconfig.json的目录时,必须相应地更改映射。
比如说,你在上面的例子中设置了"baseUrl": "./src",然后jquery应该映射到"../node_modules/jquery/dist/jquery"
使用"paths"还允许更复杂的映射,包括多个后退位置。
考虑一个项目配置,其中只有一些模块在一个位置可用,其余模块在另一个位置。
构建步骤将它们放在一个地方。
项目布局可能如下所示:
projectRoot ├── folder1 │ ├── file1.ts (imports 'folder1/file2' and 'folder2/file3') │ └── file2.ts ├── generated │ ├── folder1 │ └── folder2 │ └── file3.ts └── tsconfig.json
相应的tsconfig.json如下所示:
{ "compilerOptions": { "baseUrl": ".", "paths": { "*": [ "*", "generated/*" ] } } }
这告诉编译器任何与模式"*"(即所有值)匹配的模块导入,以查看两个位置:
1) "*"表示同名不变,因此map <moduleName> => <baseUrl>/<moduleName>
2) "generated/*"表示带有附加前缀"generated"的模块名称,因此map <moduleName> => <baseUrl>/generated/<moduleName>
遵循此逻辑,编译器将尝试解析这两个导入:
1) import 'folder1/file2'
1. 模式'*'匹配,通配符捕获整个模块名称
2. 尝试列表中的第一个替换:'*' -> folder1/file2
3. 替换结果是非相对名称 - 将其与 baseUrl -> projectRoot/folder1/file2.ts 结合使用。
4. 文件已存在。完成。
2) import 'folder2/file3'
1. 模式'*'匹配,通配符捕获整个模块名称
2. 尝试列表中的第一个替换:'*' -> folder2/file3
3. 替换结果是非相对名称 - 将其与 baseUrl -> projectRoot/folder2/file3.ts 结合使用。
4. 文件不存在,移动到第二个替换
5. 第二次替换'generated/*' -> generated/folder2/file3
6. 替换结果是非相对名称 - 将它与baseUrl -> projectRoot/generated/folder2/file3.ts结合使用
7. 文件已存在。完成。
使用rootDirs的虚拟目录
有时,编译时来自多个目录的项目源都被组合在一起以生成单个输出目录。
这可以看作是一组源目录创建一个"虚拟"目录。
使用'rootDirs',您可以通知编译器构成此"虚拟"目录的根;
因此编译器可以解析这些"虚拟"目录中的相关模块导入,就像在一个目录中合并在一起一样。
例如,考虑这个项目结构:
src └── views └── view1.ts (imports './template1') └── view2.ts generated └── templates └── views └── template1.ts (imports './view2')
src/views中的文件是某些UI控件的用户代码。
生成/模板中的文件是由模板生成器自动生成的UI模板绑定代码,作为构建的一部分。
构建步骤会将/src/views和/generated/templates/views中的文件复制到输出中的同一目录。
在运行时,视图可以期望其模板存在于其旁边,因此应使用相对名称"./template"将其导入。
要指定与编译器的此关系,请使用"rootDirs"。
"rootDirs"指定一个根列表,其内容应在运行时合并。
因此,按照我们的示例,tsconfig.json文件应如下所示:
{ "compilerOptions": { "rootDirs": [ "src/views", "generated/templates/views" ] } }
每次编译器在其中一个rootDirs的子文件夹中看到相对模块导入时,它将尝试在rootDirs的每个条目中查找此导入。
rootDirs的灵活性不仅限于指定逻辑合并的物理源目录列表。
所提供的阵列可以包括任意数量的ad hoc,任意目录名,而不管它们是否存在。
这允许编译器以类型安全的方式捕获复杂的捆绑和运行时功能,例如条件包含和项目特定的加载器插件。
考虑一种国际化场景,其中构建 工具 通过插入特殊路径令牌(例如#{locale})自动生成特定于语言环境的包,作为相对模块路径的一部分,例如./#{locale}/messages。
在此假设设置中,该工具枚举支持的语言环境,将抽象的路径映射到./zh/messages,./de/messages等。
假设每个模块都导出一个字符串数组。
例如./zh/messages可能包含:
export default [ "您好吗", "很高兴认识你" ];
通过利用rootDirs,我们可以通知编译器这个映射,从而允许它安全地解析./#{locale}/messages,即使该目录永远不存在。
例如,使用以下tsconfig.json配置:
{ "compilerOptions": { "rootDirs": [ "src/zh", "src/de", "src/#{locale}" ] } }
编译器现在将解析来自'./#{locale}/messages'的导入消息,以便从工具中导入来自'./zh/messages'的消息,允许以区域设置无关的方式进行开发,而不会影响设计时支持。
未完待续...
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【译】Go 模块使用入门
- Python Requests模块快速入门
- TypeScript基础入门之模块(一)
- TypeScript基础入门之模块解析(一)
- Node.js模块系统 (创建模块与加载模块)
- 黑客基础,Metasploit模块简介,渗透攻击模块、攻击载荷模块
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Flash第一步
陈冰 / 清华大学出版社 / 2006-3 / 45.00元
《Flash第1步:ActionScript编程篇》(珍藏版)为《Flash第一步》的ActionScript编程篇,包含后4部分内容。第3部分为ActionScript篇,你将学会像一个软件设计师那样来思考问题,并掌握在Flash中进行程序开发工作所必须具备的重要知识,还将学会运用Flash完整的编程体系来完成从简单到复杂的各种编程任务。另外,在开发一个Flash应用过程中会涉及的各种其他Web......一起来看看 《Flash第一步》 这本书的介绍吧!