ES6标准发布后,module成为标准。标准用法是用export命令导出接口,用import导入模块。然而,在我们平常的node模块中,我们采用CommonJS规范,使用require引入模块,使用module.exports导出。界面。
如果require和import没有梳理清楚的话,在以后的标准编程中会非常难看。
require时代的模块
节点编程中最重要的思想之一是模块,正是这种思想使大规模JavaScript 项目成为可能。模块化编程在js界流行,也是基于此。后来在浏览器端也出现了requirejs、seajs等工具包。可以说,在相应的规范下,require 主导了ES6 之前的所有模块化编程,即使是现在,在ES6 模块完全实现之前,情况仍然如此。
Node的模块遵循CommonJS规范,requirejs遵循AMD,seajs遵循CMD。虽然有所不同,但我们还是希望保持相对统一的代码风格。
可以看到,为了保持风格上的高度统一,除了在浏览器端模块中使用了define函数来提供模块的闭包之外,其他代码都可以完全一致。
ES6中的module
ES6发布的模块没有直接使用CommonJS,甚至没有require。这意味着require 仍然只是Node 的私有全局方法,而module.exports 只是Node 的私有全局变量属性,这与标准的一半无关。
导出导出模块接口
导出的用法相当复杂。您可以在此处查看详细信息。以下是一些示例:
在要导出的接口前面添加导出指令。
请注意,以下语法是严重错误的:
export导出接口时,必须与模块内部的变量一一对应。直接导出1是没有意义的,导入时也不可能有与之对应的变量。
导出一个
虽然这似乎是真的,但
的值为数字,根本无法完成解构,所以必须写成export {a}
形式。即使将a赋值给函数,也是不允许的。而且,大多数样式建议最好在模块末尾使用导出来导出所有接口,例如:
导入导入模块
import的语法与require不同,import必须放在文件的开头,前面不允许有其他逻辑代码,这与所有其他编程语言的风格一致。
import的使用和export一样,也比较复杂。在这里你可以得到一个大概的了解。举几个例子:
这里有一些陷阱,我暂时不透露,但会在下面讨论。
import 后跟花括号的形式是最基本的用法。大括号内的变量对应导出后的变量。这里,你必须了解对象解构和赋值的知识。如果没有这些知识,你根本无法在这里炫耀。理解了解构赋值,这里的“一一对应”关系就可以详细理解了。
作为关键字
对于编程学生来说很容易理解。简单来说,它只是一个别名。它可以用于导出,实际上也可以用于导入:
上述代码导出时,对外提供的接口是fun,是a.js内部函数a的别名。然而,在模块之外,a是不被识别的,只有fun被识别。
import 中的as 非常简单。当您在模块中使用某个方法时,您可以为该方法指定一个别名,以便可以在当前文件中使用它。这样做的原因是有时两个不同的模块可能会传递相同的接口。比如有一个c.js也传递fun接口:
如果在b.js中同时使用a和c这两个模块,就必须想办法解决接口名重复的问题,as就会解决。
默认关键字
还有人写教程,把default放在导出部分,我觉得不利于理解。导出时可以使用默认值。说白了,其实就是alias的语法糖:
导入时,可以这样使用:
这种语法糖的优点是导入时可以省略大括号{}。简单来说,如果你在导入时发现某个变量没有用大括号括起来(没有* 号),那么你就应该在脑海中将其恢复为带有大括号的as 语法。
因此,你还应该了解以下写法:
导入后的第一个
$
是{默认为$}
另类写作。 *象征
* 代表一切,仅在导入时使用。让我们看两个例子:
在意义上和
从'_' 导入_;
是不同的,尽管实际上后续的用法是相同的。意思是加“_”
模块中所有接口均挂载至_
在此对象上,因此您可以使用_.each
调用接口。另外,还可以通过*号直接继承某个模块的接口:
应尽可能少使用* 符号。它实际上使用了所有导出的接口,但很可能你当前的模块不会使用所有接口,也许只是一个,所以最好的建议是使用花括号,并添加一个。
该用require还是import?
require的使用非常简单。相当于module.exports的入口。 module.exports后面的内容是什么?要求的结果是什么?对象、数字、字符串、函数……然后将require的结果赋值。赋予一个变量相当于在并行空间中重叠require 和module.exports 的位置。
而且,require理论上可以在代码中的任何地方使用,甚至不需要在使用前赋值给变量,比如:
当你使用require时,你可以完全忽略模块化的概念而使用require。只需将其视为节点的内置全局函数,其参数甚至可以是表达式:
但导入就不一样了。它是在编译时编译的(require 在运行时编译)。它必须放在文件的开头,使用的格式是确定的,不能怀疑。它运行后不会将整个模块赋值给一个变量,而是只选择导入的接口进行编译,在性能上比require要好很多。
从理解的角度来说,require是一个赋值过程,而import是一个解构过程。当然,require也可以解构结果,并将其分配给一组变量,但是当import遇到default时,它与require完全不同:
var $=require('jquery');
并从'jquery' 导入$
它们是两个完全不同的概念。上面没有回答“我应该使用require 还是import?”的问题。因为目前来说,这个问题根本无法回答,因为目前所有引擎都没有实现导入。我们在node中使用babel来支持ES6,只是将ES6转换为ES5然后执行。 import 语法将被转码为require。这就是为什么在导出模块时使用module.exports 以及在引入模块时使用import 仍然有效的原因,因为本质上import 会被转码为require 来执行。
标题:如果你不理解Node 中的require 和import,你就会遇到麻烦。
链接:https://www.7kxz.com/news/sypc/40407.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
这个游戏让我在探索节点时陷入了困境,原来那句"Node中搞不明白require和import就会踩坑"真的是真理。
有9位网友表示赞同!
玩了这个游戏才知道,在Node.js环境中乱用require和import会造成很大的问题。
有6位网友表示赞同!
对于前端开发者来说,这款游戏提供了一个很好的机会去理解Node中的这些语句,很有教育意义。
有9位网友表示赞同!
在游戏中我发现,错误使用require和import真的很容易导致应用的崩溃,挺考验人的耐心。
有13位网友表示赞同!
通过这个游戏我意识到,搞清楚Node.js中的模块加载机制非常重要,不然就会在代码中遇坑。
有13位网友表示赞同!
这个游戏让我深刻体验了在Node环境中不当使用import时的困扰,增加了我对语法规则的理解。
有8位网友表示赞同!
在这款教育游戏中,角色不断地提醒我避免错误地运用require和import,真是醍醐灌顶啊。
有5位网友表示赞同!
"Node中没搞明白require和import"这句话在游戏中被活生生演绎了。真的挺容易出错的。
有14位网友表示赞同!
通过这个游戏,我学会了如何正确使用require和import,并意识到错误用法可能带来的严重后果。
有7位网友表示赞同!
这款游戏帮助我理解了一些复杂的语法规则,在实践过程中避免了很多常见的Node错误。
有5位网友表示赞同!
"Node没搞清楚就会踩坑"这话不是白说的。游戏中的挑战让我对错误的操作有了更深的认识。
有19位网友表示赞同!
借助这个游戏,我对JS模块系统中require和import的作用有了更深入的理解,减少了代码上的失误。
有17位网友表示赞同!
玩这款游戏时我意识到,在实际编程中如果不知道如何正确使用这些语句,可能会产生严重的问题。
有9位网友表示赞同!
"Node中没搞明白"这确实是真的。通过游戏体验让我快速理解了这段代码在运行过程中的重要性及其潜在冲突。
有9位网友表示赞同!
在游戏中尝试各种方法来解决问题后,我更加明确地了解了在Node.js中合理使用require和import的必要性。
有15位网友表示赞同!
这款游戏以一种有趣的方式加深了我的对于模块化编程的理解。在Node环境下确保代码正确导入文件是关键。
有18位网友表示赞同!
"游戏中的教训是:在Node中,不了解require和import可能引起大混乱。"这句话绝对是有道理的。
有9位网友表示赞同!
通过这款模拟的游戏,我学会了一个教训--在Node.js的世界里,对模块操作的认知决定了编程的流畅性。
有19位网友表示赞同!
游戏中那些挑战,像'踩坑'这样的体验,实际就是提醒我在未来编程时要仔细检查导入语句是否正确。
有8位网友表示赞同!
这款游戏不仅好玩,更重要的是它教会了我如何在Node环境下的代码中避免一些容易犯的错误,尤其是关于require和import的部分。真的很实用!
有13位网友表示赞同!