详解JS模块导入导出


Posted in Javascript onDecember 20, 2017

开发中基本不会将所有的业务逻辑代码放在一个JS文件中,特别是在使用前端框架,进行组件化开发中时,会复用相应的组件。这时,就会用到模块导入/导出的方法了。

当然,上面提到有模块的概念,也是在JS用于服务器端编程的时候才会出现,我们在使用前端框架时,使用npm run dev,不就是启动了一个node服务。 对于JavaScript模块化编程的起源可以追溯到2009年,Ryan Dahl在github上发布了node 的最初版本。

本文主要介绍几种模块导入/导出的方法。

node 中模块导出/导入

平时我们接触最多的模块导入的例子,就是使用npm安装各种开源模块,然后在项目中使用例如import,require的方法引入,或者更加直白的直接使用script标签引入入node_module中对应模块打包过后的源文件。

为什么可以直接引入这些npm模块呢?一般在每个模块的源文件里面,都会找到modules.exports方法。用来导出变量。比如下面我们在使用gulp打包压缩时,经常使用到的gulp-rename这个插件通过npm安装后,在node_modules中的gulp-rename/index.js

'use strict';

var Stream = require('stream');
var Path = require('path');

function gulpRename(obj) {

 var stream = new Stream.Transform({objectMode: true});
 ... 

 return stream;
}

module.exports = gulpRename;

看到的基本思路就是,定义了gulpRename 方法,然后把它抛出去。

node中的module都遵循CommonJS规范。在CommonJS中有一个全局的require()方法,用于加载模块;module.export 和 export 方法,导出模块。

这里比较重要的一点是: 我们在写模块时用到的exports对象实际上只是对module.exports的引用,所有在一些js库的源码中,经常可以看到这样的写法:

exports = module.exports = somethings

// export.js 文件中
var export1 = "from export1"
var export2 = function(){
 return "from export2";
}
exports.export2 = export2;
 // modules.js 文件中
 var module1 = "from module1";
 var module2 = function(e){
 return "from funModule2";
 }
 module.exports.str1 = module1;
 module.exports.fun2 = module2;

最后在common.js文件中引入exports.js文件和 modules.js 文件,

var md1 = require("./module.js")
console.log(md1);
var export3 = require("./export");
console.log(export3);

最后在gitbash中,使用node 执行相应的commons.js文件;

详解JS模块导入导出

在使用exports方法是,不能直接exprots = {},这样改变了exports方法的引用, 相应就无法实现导出模块的功能了。

es6导出方法

es6中也同样提出了比较好用的模块导出的方法,包括两种。

命名导出

如果在一个文件中想要导出多个不同的变量,可以分别对不同的变量命名,然后分别导出,避免相互污染。

// export3.js 文件
 export const myModules = {c:1 }
 export const myModules2 = {d:2 }
 // import.js 文件
 import {myModule1,myModule2} from './export3.js' ;
 console.log(myModule1);
 console.log(myModule2);
 // index.html 文件
<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8">
 <title>es6</title>
 </head>
 <body>
 <script src="./import.js"></script>
 </body>
</html>

然后,我们尝试使用最经新出的 打包工具parcel(node版本在8.0以下安装会报错)小试牛刀, 具体已经安装完成了,在命令行中输入 parcel index.html,就会在1234 端口启动服务,主要为了能够在http://localhost:1234/中看到console。

详解JS模块导入导出

默认导出

如果只在一个文件中提供了一个导出的口,就可以使用默认导出

//export4.js 
 const str2 ="hello world";
 export default str2 ;
 // import2.js
 import anyName from "./export4.js"
 console.log(anyName);

在index.html 中 <script src="./import2.js"></script>可以看到输入 hello world

同样是模块导入导出方法,使用es6的模块方法,要比node中 的(也就是CommonJS模块)方法更加的差异非常大。
主要有如下两点差别:

CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。

CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

以上就是我们本次给大家介绍的关于JS模块导入导出问题的全部内容,如果大家还有任何不明白的地方可以在下方的留言区域讨论,感谢你对三水点靠木的支持。

Javascript 相关文章推荐
一个简单的JavaScript 日期计算算法
Sep 11 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
Jan 15 Javascript
基于Bootstrap3表格插件和分页插件实例详解
May 17 Javascript
jquery+CSS3实现3D拖拽相册效果
Jul 18 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
node安装--linux下的快速安装教程
Mar 21 Javascript
VUE元素的隐藏和显示(v-show指令)
Jun 23 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
微信小程序之 catalog 切换实现解析
Sep 12 Javascript
微信小程序转发事件实现解析
Oct 22 Javascript
Swiper实现导航栏滚动效果
Oct 16 Javascript
JS数组方法some、every和find的使用详情
Oct 05 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
Dec 19 #Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
Dec 19 #Javascript
常用的9个JavaScript图表库详解
Dec 19 #Javascript
完美解决手机网页中输入框被输入法遮挡的问题
Dec 19 #Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 #Javascript
Angular2实现组件交互的方法分析
Dec 19 #Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
Dec 19 #Javascript
You might like
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
支持oicq头像的留言簿(一)
2006/10/09 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
PHP 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
Prototype使用指南之array.js
2007/01/10 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
Python封装shell命令实例分析
2015/05/05 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Django添加sitemap的方法示例
2018/08/06 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
vue常用指令代码实例总结
2020/03/16 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
车工岗位职责
2013/11/26 职场文书
副董事长岗位职责
2014/04/02 职场文书
三峡大坝导游词
2015/01/31 职场文书
旷工辞退通知书
2015/04/17 职场文书
党员进社区活动总结
2015/05/07 职场文书
河童之夏观后感
2015/06/11 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书