首页 > 编程语言 >JavaScript ES6中 module , import和export

JavaScript ES6中 module , import和export

时间:2024-01-24 22:01:58浏览次数:31  
标签:ES6 代码 JavaScript 导出 js export 模块 import

 

 

假如你想直接在 html 的 script 里面使用 import,你会遇到以下这两个问题:

  1. 需要给 script 标签添加 type='module' 属性
  2. 会遇到跨域问题,不单独启用一个服务器无法解决

如果不启动一个 server,访问 js 用的协议是 file,不在浏览器跨域允许的协议中。因此无法做到拿到 js 文件,源代码如下。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>hello world</div>
    <script type='module'>
        import obj from './a.js'
        console.log(obj)
    </script>
</body>
</html>

a.js

import {b} from './b.js'
var c = 20;
const a=5;
console.log('[a]',a)
export default {a,b}

解决的办法是,我们需要搭一个 node 服务器,以 express 为例,新建 server.js 文件。

var express = require("express");
var app = express();
app.use(express.static("./")).listen(3000);

在命令行输入

node server.js 跑起服务器,访问 localhost:3000,此时,跨域问题被解决。

或者安装一个插件:VSCode的一个扩展Live Server 。在index.html页面右键选择Open with Live Server

在script标签中写js代码,或者使用src引入js文件时,默认不能使用module形式,即不能使用import导入文件,但是我们可以再script标签上加上type=module属性来改变方式。

 

深入了解JavaScript Module

在其他编程语言中,我们可以通过划分模块,来组织庞大复杂的项目,而JS一开始并没有模块的概念,因为一开始JS的脚本就很简单。

后来随着JS的发展,前端要开发的项目越来越复杂,也越来越大型,因此需要更好的代码组织方式,于是JS也引入了模块功能,比如AMD,UMD,CommonJS等等不同的模块加载方式。

而在ES6规范中,也引入了官方的模块加载方式,也就是我们下面要讨论的知识。

什么是模块

在JS中,一个文件或者脚本就是一个模块,模块可以声明哪些变量或函数供外部使用,也可以引入其他模块的变量与函数为自己所用,在模块中,使用export标记了可以从当前模块外部访问的变量和函数,使用import从其他模块导入所需要的功能,如:

hello.js

  javascript 复制代码
//声明当前模块可以被其他模块使用的变量

export function sayHello() {
    alert('Hello');
}

main.js

  scss 复制代码
//导入其他模块的变量
import {sayHello} from './hello.js'; 

alert(sayHello); 

sayHello(); 

 

在浏览器中使用模块

在支持ES6规范的浏览器中,可以使用用script type="module"></script>标签可以声明模块或者导入其他模块,如:

  复制代码
<!doctype html> 
<script type="module"> 
    import {sayHi} from './say.js';
    document.body.innerHTML = sayHi('John'); 
</script>

其实,目前前端项目开发中,并不会使用上面这种在浏览器中使用模块的方式,我们一般是创建一个工程项目,再通过webpack这类的构建工具解析各个模块的导出与依赖,最终打包上线的。

模块的特性

现代模式

模块的代码始终默认使用现代模式use strict,例如对一个未声明的变量赋值或者重复声明变量都将产生错误。

  ini 复制代码
<script type="module">
    test = 5; // 未声明就使用,报错
    let a = 1;
    let a = 2;//重复声明,报错
</script>

作用域

每个模块都有自己的顶级作用域,也就是说,一个模块中的顶级作用域变量和函数在其他模块中是不可见的,如:

  xml 复制代码
<script type="module">
    let a = 10;
</script>

<script type="module">
    alert(a)//报错,a is not defined
</script>

上面的示例中,如果把type=module去掉,变成非模块代码,则可以正常运行。

模块代码解析

如果同一个模块被导入多次,那么它的代码只在第一次导入时便解析运行,比如下面的示例中,只会弹窗一次:

hello.js

  scss 复制代码
alert(1);

index.html

  xml 复制代码
<script type="module" src="./hello.js"></script>

<script type="module" src="./hello.js"></script>

this的值

在JS模块中,this关键字的值undefined,非模块脚本的顶级 this 是全局对象,比如浏览器的window

非模块代码

  xml 复制代码
<script>
    alert(this)
</script>

模块代码

  xml 复制代码
<script type="module">
    alert(this)//undefined
</script>

export

export命令用于模块内部导出可供外部使用的变量,导出的方式有:

在声明前导出

可以在变量或函数声明加上export命令,便可以直接导出该变量或函数,如:

  javascript 复制代码
export function sayHello(){
    return "Hello";
}

export let a = 1;

导出与声明分开

也可以在声明之后,再使用export命令进行导出,不过这时候,导出的变量需要用花括号{}包括起来,如:

  javascript 复制代码
//声明
function sayHello(){
    return "Hello";
}
//导出
export {sayHello};//正确
//export sayHello;错误

也可以同时导出多个变量,如:

  javascript 复制代码
function sayHello(){
    return "Hello";
}

const username='test';

export {username,sayHello}

默认导出

如果直接使用export导出,则使用者必须知道模块导出的变量名称,否则就无法加载,因为使用者需要先了解你的模块代码,但如果想让使用者直接使用而不用了解你的代码,则可以使用export default来指定模块的默认输出。

hello.js

  javascript 复制代码
export default function(){
    return "hello"
}

main.js

  javascript 复制代码
import sayHi from './hello.js';//导出默认输出时,可以自定义变量的名称
sayHi();

导出时给个别名

在导出的时候,可以使用关键字as给导出的变量重新命名,如:

  javascript 复制代码
function sayHello(){
    return "Hello";
}

export {sayHello as sayHi}

import

import命令用于在当前模块中导出其他模块的可用变量与函数。

整体导入

如果要导入一个模块的全部变量与函数,可以使用*导出全部,但这种不按需导入的方式,可以会导入很多你不需要的东西,因此一般不推荐使用:

  javascript 复制代码
import * from './hello.js'

另外,可以使用as关键字给整体导出起一个别名,如:

  javascript 复制代码
import * as say from './hello.js';

say.hello();

按需导入

如果我们只需要导入其他模块的部分功能,则可以使用花括号{}来指定要导出的变量与函数,如:

  javascript 复制代码
import {sayHi,sayHello} from './hello.js';

导入时给个别名

在导入的时候,也可以使用关键字as给导入的变量与函数起个别名,如:

  javascript 复制代码
import {sayHi as hi, sayBye as bye} from './hello.js';

导入模块的默认导出变量时,则不需要使用花括号,如:

  javascript 复制代码
import sayHi from './sayHi.js'; //sayHi.js模块中有使用export default导出的变量或函数

小结

JS模块可以让我们把一个很大的前端项目拆分一个个JS小文件,然后再通过构建工具将这些文件组织起来打包运行,因此JS模块的使用,也是前端程序员的必须掌握的知识,希望通过这篇文件能让你对这方面的知识有更加深入的了解。



链接:https://juejin.cn/post/7023218660630069279

标签:ES6,代码,JavaScript,导出,js,export,模块,import
From: https://www.cnblogs.com/youxin/p/17985951

相关文章

  • [转]JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
    原文地址:JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js_js计算精度问题-CSDN博客一、计算精度现象举例举例1、加法 举例2、减法 举例3、乘法 举例3、除法 二、JS为什么会有计算精度的问题JavaScript内部只有一种数字类型Number,也就是说,Java......
  • Using classes exported from a DLL using LoadLibrary
    UsingclassesexportedfromaDLLusingLoadLibraryAnup.VRateme: 4.94/5(67votes)25Jan20056minread 368.5K    10.8K    129    41AnarticleonloadingaDLLexplicitlyusingLoadLibraryandusingthecla......
  • javaScript找出两个数组之中不同的元素
    在JavaScript中,我们可以使用以下方法找到两个数组中不同的元素:1.创建一个函数,将两个数组作为参数传递进去。2.在函数内部,创建一个新的空数组,用于存储不同的元素。3.使用for循环遍历第一个数组,并使用indexOf()方法检查第二个数组中是否存在相同的元素。4.如果第二个数组中......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>输......
  • JavaScript DOM表单相关操作之表单验证
    在大部分的情况下我们希望用户输入的数据是我们理想中的格式,尤其是在用户注册上,一些重要的信息我们是不允许用户乱写的,如手机号,邮箱等。接下来一起看几种表单验证的方式:1、验证长度验证长度是比较简单的,input标签元素的maxlength属性可以设置可输入的最大长度//用maxlength属......
  • 写给不耐烦程序员的 JavaScript 指南(二)
    第四部分:原始值原文:exploringjs.com/impatient-js/pt_primitive-values.html译者:飞龙协议:CCBY-NC-SA4.0下一步:14非值undefined和null十四、非值的undefined和null原文:exploringjs.com/impatient-js/ch_undefined-null.html译者:飞龙协议:CCBY-NC-SA4.014......
  • 深入 JavaScript:理论和技术(上)
    第一部分:前言原文:exploringjs.com/deep-js/pt_frontmatter.html译者:飞龙协议:CCBY-NC-SA4.0下一步:1关于本书一、关于这本书原文:exploringjs.com/deep-js/ch_about-book.html译者:飞龙协议:CCBY-NC-SA4.01.1 这本书的主页在哪里?1.2 这本书包括什么?1.3 ......
  • 细说JavaScript事件处理(JavaScript事件处理详解)
    js语言的一个特色和就是它的动态性,即一时间驱动的方式对用户输入作出反应而不需要依赖服务器端程序。事件是指人机交互的结果,如鼠标移动、点击按钮、在表单中输入数据或载入新的Web洁面等。一、什么是事件事件是一些可以通过脚本响应的页面动作,当文档、浏览器、元素发生某些有趣......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head......