JavaScript模块化总结(四)

159 阅读3分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

在上两篇文章中,我们介绍了CommonJS。本篇文章介绍目前使用最多的ES Module的基本使用。

ES Module的基本使用

ES Module是目前使用最多的模块化方案,现在node也慢慢支持ES Module了。

与CommonJS的不同之处在于:

(1)ES Module采用importexport 关键字来实现模块化,其中export将模块内的内容导出,import将从其他模块导入内容。要注意的是,ES Module用的不是对象,也不是函数。关键字意味着export和import在解析的时候要交给js引擎把这个关键字做解析,解析完才知道这个语句是什么意思。

(2)它采用了编译期的静态分析,并且加入了动态引用的方式。

采用ES Module将自动采用严格模式: use strict。

首先我们在foo.js文件中使用export将name和age这两个变量进行导出。在语句声明的前面直接加上export关键字。这是一种导出方式,其他的导出方式我们在下一篇文章中介绍。

export const name = 'haha'
export const age = 18

在main.js文件中使用import进行导入。import {标识符列表} from '模块'; 注意,这里的{}不是一个对象,里面只是存放导入的标识符列表内容。而且,路径的文件名必须要加后缀.js。因为查找文件的时候, 不会默认帮我们加.js后缀名。之前我们不需要加后缀,是因为在webpack环境会自动加上这个后缀名。如果在脚手架中,webpack会默认帮我们加.js后缀。没有webpack情况下,js引擎加载js文件的时候需要加上.js后缀名找到对应的文件。

import {name, age} from './foo.js'
console.log(name);
console.log(age);

最后我们在index.html中引入main.js。

<body>
  <script src="./main.js"></script>
</body>

运行该文件,我们可以在浏览器中发现报了如下错误,不能在模块外使用import关键字。

image.png 这是什么原因呢?这是因为默认情况下,上述写得script标签去加载一个js文件的时候,它会把js文件当做普通的js去解析,不允许里面有import关键字,会报上面的错误。

那么我们要怎么告诉它我们要加载的是一个模块,并且需要以模块化的方式去解析代码?我们需要在script标签中加上type属性,告诉它我们要加载的文件是一个模块。

<body>
  <script src="./main.js" type="module"></script>
</body>

运行代码,我们发现还是报错。

image.png 因为我们是通过本地去加载html文件的(比如一个file://路径的文件),我们会碰到CORS错误,因为javascript模块安全性需要,不允许通过file协议去加载模块代码,根据错误提示我们可以了解到可以通过http请求。

image.png

image.png 我们需要安装live server插件,它会帮助我们在本地开启一个服务器,index.html,main.js,foo.js等这些资源都在服务器上,当我们向服务器通过http请求的时候会返回index.html文件。

image.png

image.png 此时,我们可以看到打印出来的结果。

image.png