摘要:本文主要介绍几种模块导入导出的方法。默认导出如果只在一个文件中提供了一个导出的口,就可以使用默认导出在中可以看到输入同样是模块导入导出方法,使用的模块方法,要比中的也就是模块方法更加的差异非常大。
在开发中基本不会将所有的业务逻辑代码放在一个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文件;
在使用exports方法是,不能直接exprots = {},这样改变了exports方法的引用, 相应就无法实现导出模块的功能了。
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 文件es6
然后,我们尝试使用最经新出的 打包工具parcel(node版本在8.0以下安装会报错)小试牛刀, 具体已经安装完成了,在命令行中输入 parcel index.html,就会在1234 端口启动服务,主要为了能够在http://localhost:1234/中看到console。
默认导出
如果只在一个文件中提供了一个导出的口,就可以使用默认导出
//export4.js const str2 ="hello world"; export default str2 ; // import2.js import anyName from "./export4.js" console.log(anyName);
在index.html 中 可以看到输入 hello world
同样是模块导入导出方法,使用es6的模块方法,要比node中 的(也就是CommonJS模块)方法更加的差异非常大。
主要有如下两点差别:
CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
具体解释,可以移步到ES6模块与CommonJS模块的差异
本文只是列出一些用法与代码示例,来比较不同的模块方法,列出一些更加深入讲解的文章,方便后面自己仔细研究。
import、require、export、module.exports 混合详解 -- 尚妆前端团队
Module 的加载实现 --- ECMAScrip6入门
module.exports与exports??关于exports的总结
CommonJS 系列
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92183.html
摘要:默认导出默认导出也被称做定义式导出。导出一个函数导出一个类默认导出可以理解为另一种形式的命名导出,默认导出可以认为是使用了名称的命名导出。同样的,在导入时可以使用指令导入这些默认值。 最近看了些Vue框架写的程序,发现自己的前端知识还停留在几年以前,发现现在Javascript程序里有各种各样的对module的导入和到处,导入乍一看跟python的语法挺像的无非就是把from和impo...
摘要:例如我们导入模块,可以这么导入桃翁欢迎关注公众号前端桃园报错不能定义相同名字变量报错,不能重新赋值小猪可以看到导入绑定这里不理解绑定,文章后面会解释时,形式类似于对象解构,但实际上并无关联。 欢迎访问个人站点 简介 何为模块 一个模块只不过是一个写在文件中的 JavaScript 代码块。 模块中的函数或变量不可用,除非模块文件导出它们。 简单地说,这些模块可以帮助你在你的模块中编写...
摘要:一模块化前端模块化的好处都已经被说烂了,归纳为两点避免全局变量污染有效的处理依赖关系终于引入了模块的概念,最近学习了下,顺便记下笔记。命名导出命名导出就是明确导出的变量名称和值。其中表示导出模块所有的命名输出。 一、模块化 前端模块化的好处都已经被说烂了,归纳为两点: 避免全局变量污染 有效的处理依赖关系 ES2015终于引入了模块的概念,最近学习了下,顺便记下笔记。 二、准备工作...
摘要:无论是否声明了,导入的模块都运行在严格模式下。这通常是包含模块的文件的相对或绝对路径名,可以不包括扩展名。引用时将用作一种命名空间的模块对象的名称。导出参数指定单个命名导出,而语法导入所有导出。导入默认值在无论是对象函数类等有效时可用。 import 语句用于导入由另一个模块导出的绑定。无论是否声明了 strict mode,导入的模块都运行在严格模式下。import语句不能在嵌入式脚...
摘要:所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。目前,主要有两个库实现了规范和。这些导出对象用名称进行区分,称之为命名式导出。 简单粗暴,富婆给你说,其实我也没太搞明白,最近看了一篇文章我才理清了一点点思路,最近整日沉迷于肥宅快乐水,技术都跟不上了,来篇文章,提神醒脑,朝着我的富婆梦更近一步,早日走上富婆路,包养我家大狼狗!!! 为什么有模块概念...
阅读 1892·2021-11-22 15:25
阅读 1249·2021-11-19 09:40
阅读 1856·2021-09-27 13:57
阅读 984·2021-09-22 15:10
阅读 972·2021-08-16 11:01
阅读 2971·2021-07-23 17:51
阅读 765·2019-08-30 15:55
阅读 817·2019-08-30 13:58