最基础的前端就是HTML+CSS+Javascript。掌握这三项技术算是入门,但也只是入门而已。现在前端开发的定义远不止于此。前端小课堂(HTML/CSS/JS),本着提高技术水平,夯实基础知识的中心思想,开课(每周四)。Node应用程序由模块组成,使用CommonJS模块规范。每个文件都是一个模块,有自己的作用域。文件中定义的变量、函数和类都是私有的,对其他文件不可见。//导出addXmodule.exports.addX=1;//导入模块example=require('./example.js');console.log(example.addX)commonjs模块规范的特点是所有代码都在模块作用域内运行,不会污染全局作用域。模块可以多次加载,但第一次加载时只会运行一次,然后缓存运行结果,后面加载时直接读取缓存的结果。要使模块再次工作,必须清除缓存。加载模块的顺序,按照它们在代码中出现的顺序。CommonJS规范的加载模块是同步的,也就是说加载完成后才能进行后面的操作。模块对象Node内部提供了一个Module构造函数。所有模块都是Module的实例。在每个模块内部,都有一个表示当前模块的模块对象。它具有以下属性。module.id模块的标识符,通常是带有绝对路径的模块文件名。module.filename模块的文件名,带有绝对路径。module.loaded返回一个布尔值,指示模块是否已完成加载。module.parent返回一个代表调用该模块的模块的对象。if(!module.parent){//使用`nodesomething.js`运行app.listen(8088,function(){console.log('applisteningonport8088');})}else{//用于`require('/.something.js')`module.exports=app;}module.children返回一个数组,表示该模块将使用的其他模块。module.exports表示模块导出的值。AMD模块规范CommonJS规范是同步加载模块的,也就是说加载完成后才能进行后面的操作。AMD规范是一个异步加载的模块,允许指定回调函数。由于Node.js主要用于服务端编程,模块文件一般已经存在于本地硬盘上,所以加载速度更快,而且不需要考虑异步加载的方式,所以CommonJS规范更适用。但是如果是浏览器环境,则必须从服务器端加载模块,此时必须采用异步方式,所以浏览器端一般采用AMD规范。AMD规范使用define方法来定义模块,下面是一个例子:define(['package/lib'],function(lib){functionfoo(){lib.log('helloworld!');}return{foo:foo};});AMD规范允许输出模块兼容CommonJS规范。这时候define方法需要这样写:define(function(require,exports,module){varsomeModule=require("someModule");varanotherModule=require("anotherModule");someModule.doTehAwesome();anotherModule.doMoarAwesome();exports.asplode=function(){someModule.doTehAwesome();anotherModule.doMoarAwesome();};});ESMModuleSpecification“ESM”全称ECMAScript模块,基本主流浏览器版本都已经支持。主要用于浏览器原生支持模块化,。ESM使用实时绑定逻辑,两个模块都指向内存中的相同位置。这意味着当导出模块更改值时,该更改将显示在导入模块中。这与CommonJS模块不同,在CommonJS模块中,整个导出对象在导出时被复制。这意味着CommonJS模块导出的任何值(例如数字)都是一个副本,如果CommonJS模块导出模块后来更改了该值,则导入模块将看不到该更改。ESM的工作原理浏览器构建一个依赖图。通过指定一个入口文件(),然后从这个文件开始,通过里面的import语句寻找其他代码。浏览器通过指定的文件路径找到目标代码文件。但是浏览器并不直接消费这些文件,它需要将它们全部解析并转换成称为模块记录的数据结构。将模块记录转换为模块实例。模块实例实际上是“代码”(指令列表)和“状态”(所有变量的值)的组合。ESM动态路径因为ESM的特性,一般情况下不能使用变量作为路径//commonjs其实是同步的,会挂起主线程加载文件,//因为commonjs主要用于node,所以非常容易从本地磁盘快速加载资源。require(`${publicPath}/count.js`);//因为ESM规范是静默分析资源下载,所以实际上变量还没有执行importcountfrom`${publicPath}/count.js`;//但有时我们希望有这样的功能。这时候我们可以使用import动态导入功能,它会开始一个新的加载过程。node中使用的import(`${path}/count.js`)遇到了这种兼容性问题,在babel上OK社区(Node14)试图解决这个问题的一种方法是使用.mjs扩展名。使用该扩展名告诉Node,“这个文件是一个模块”。概要名称导入关键字导出关键字规范来源&备注CommonJS,CJSrequire('path')module.exportsNodeJS,同步,加载本地资源同步快然后执行ESM,MJSimportafrom'path',import()export,exportdefaultbrowser,异步,因为不可靠的网络因素,会在所有资源加载完成后执行。module.exports.foo='bar'命名导出module.exports='baz'默认导出。导出常量总和=(x,y)=>x+y;命名导出导出默认值(x,y)=>x+y;默认导出微信公众号:前端linong参考前端培训目录,前端培训规划,前端培训计划https://javascript.ruanyifeng.com/nodejs/module.html说说ESM、Bundle、Bundleless,Vite,SnowpackNode模块化:为什么CommonJS和ESModules不能相互协调
