许多现存的web应用用<script>
标签加载js文件和html文件。虽然用相同的方式添加Angular的代码到页面中是能够作到的,可是最推荐的方式是去经过SystemJS库去加载代码。Angular内部也用SystemJS。
在这一章,咱们将简单介绍SystemJS因此你能够用来开发Angular应用。SystemJS的详细教程,经过SystemJS网站的GitHubhtml
<script>
标签为何仍是使用模块加载器去加载JavaScript,而不是使用<script>
标签?
<script>
标签有如下几个问题:git
<script>
标签.它们中的一些将来多是多余的,但你忘记去清理它们,它们仍旧会被浏览器加载,增长了加载时间和浪费了网络带宽.<head>
标签里。可是把全部脚本放在里被认为是一种很差的实践,由于它阻止了页面加载,由于在全部脚本下载完以前页面才开始渲染。让咱们考虑在开发模式用模块加载器的好处和准备应用的生产版本:es6
当你在html页面上用SystemJS, 这个库成为全局对象并包含了数个静态方法。你会用到的的主要的俩个方法是System.import()
和System.config()
.
用System.import()
去加载一个模块,这个方法接受一个模块名做为一个参数。一个模块名能够是一个文件的路径或者映射到文件名的逻辑名称
System.import('./my-module.js'); // 文件路径
System.import('@angular2/core'); // 一个逻辑名称
若是模块名以 ./开头并做为文件的路径即便当文件名的类型被省略了,SystemJS仍是会首先去匹配文件名对提供的配置映射做为System.config()的参数或者是一个文件(好比system.config.js)。若是名字的映射没有找到,它会被看做为是文件的路径github
注意:在此书中,咱们会用 ./前缀和映射配置去找出哪一个文件应该被加载。若是你看到
System.import('app')
而且不能找到文件名为app.ts的文件,那就检查下项目的映射配置。web
System.import()方法会马上返回一个Promise对象(见附录A)。当模块对象的promise为resolved,当模块被加载后,then()回调函数会被唤起,若是promise是rejected, 错误会被catch()方法处理。
一个es6模块对象在装载的模块中包含了每一个输出值的属性。接下来的一段来自俩个文件的代码段向你展现了如何在模块中输出一个变量并用在其余脚本中:
// lib.js export let foo = 'foo'; // main.js System.import('./lib.js').then(libModule => { libModule.foo === 'foo'; // true });
这里当lib.js被加载后,你用then()方法去指定一个回调函数唤起。被加载的对象以一个参数的形式传进箭头表达式中。
在es5脚本中,你用System.import()方法去加载代码同步或异步(动态的)。例如:若是一个匿名的用户浏览你的网站,你可能不须要一个模块去执行用户简介这一功能(由于用户没登陆嘛)。可是当你的用户登陆了,你能够动态的加载用户信息模块,这样,你减小了初始化网站所须要的时间和体积。
可是es6 import声明呢?若是在你的第一个Angular应用,你在index.html文件中用system.import()去加载根程序模块, main.ts。相应的,main.ts脚本用它本身import声明引入Angular模块。
当SystemJS加载了main.ts, 它自动的把它转化为ES5兼容代码,因此就不会有import声明在浏览器的代码中执行。将来,es6模块会被主流浏览器原生支持,这一步就不须要了而且import声明将会和System.import()以相同的方式运行,除非他们不会控制模块加载的时刻。promise
注意:当SystemJS转换文件时,它自动的生成每一个.js文件的sourcemap, 这将容许你去浏览器在调试ypeScript代码。浏览器