详解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 相关文章推荐
DIV菜单层实现代码
Nov 19 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
表单JS弹出填写提示效果代码
Apr 16 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
Apr 27 Javascript
固定网页背景图同时保持图片比例的思路代码
Aug 15 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
JQuery 传送中文乱码问题的简单解决办法
May 24 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
Jan 08 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 Javascript
jQuery zTree插件使用简单教程
Aug 16 jQuery
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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
解析php中curl_multi的应用
2013/07/17 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
jQuery遮罩层效果实例分析
2016/01/14 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
Nest.js 授权验证的方法示例
2021/02/22 Javascript
Python自动连接ssh的方法
2015/03/07 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Python 学习教程之networkx
2019/04/15 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
奶茶专卖店创业计划书
2014/01/18 职场文书
个人简历中自我评价
2014/02/11 职场文书
房屋质量投诉书
2015/07/02 职场文书
简历自我评价范文
2019/04/24 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android