我正在使用Javascript和Typescript进行Angular2快速入门教程,在javascript版本中,我观察到组件和模块首先被分配给变量( window.app ,我将其理解为一些全局变量可以通过js文件或脚本块访问),这很好。使用导出和导入来输入脚本版本,我试图分析生成的javascript代码,但什么都不懂。有人可以解释一下这个导出和导入在Tyepescript中是如何工作的。
答案 0 :(得分:5)
这里的文档https://www.typescriptlang.org/docs/handbook/modules.html很好地解释了打字稿中的导入和导出。
就像toskv在评论中所说,你的TypeScript文件中的这些语句如何被转换成JavaScript文件中的语句在很大程度上取决于你在tsconfig.json
文件中设置的模块系统。
例如,设置"module": "commonjs"
将导致TypeScript编译器(tsc
)将您的导入/导出语句转换为基本上为node.js的样式require()
语句。本文档有一些简单但有用的示例,说明 node.js 模块的工作方式:https://nodejs.org/api/modules.html。
使用" systemjs"的设置而不是" commonjs"将使TypeScript将您的导入/导出语句转换为SystemJS理解的格式,我不是专家。
由于Angular 2项目还需要构建步骤来获取已转换的JavaScript文件并将其转换为打包的#34;捆绑包,因此这一过程变得更加复杂。这些捆绑文件(取决于您的配置设置)连接,缩小,甚至可能是丑化的。因此,查看运行的最终javascript代码实际上没有用,因为它不是由人类编写的。
例如,Webpack构建系统(google webpack.js)接收它在JavaScript代码中找到的require()
语句,并将每个模块包装在自己的__webpack_require__
函数中,并允许构建系统将您的整个项目文件结构并将其捆绑到一个或多个JavaScript文件中,这些文件仍然保持彼此的依赖关系。
换句话说,当您查看生产JavaScript代码时,它并不意味着人类读者可以理解。流程可以简单地用TS Source Code
>表示。 TS Transpilation into JS Code
> Module/Dependency Build Steps into Production JS Code
。
TL; DR TypeScript实际上并不处理模块导入/导出。在转换期间,它将这些语句转换为其他模块系统(node.js或SystemJS)可以理解的语句,这些语句又转换为用于服务Angular 2应用程序的生产代码。