Web 前端模块出现的原因,以及 Node.js 中的模块
模块出现原因
简单概述
随着 Web 2.0 时代的到来,JavaScript 不再是以前的小脚本程序了,它在前端担任了更多的职责,也逐渐地被广泛运用在了更加复杂的应用开发的级别上。
但是 JavaScript 缺乏一个最重要的模块机制,虽然它能够通过 <script> 标签重新组织代码和结构,但是依旧没有解决变量污染的问题,标签只作用于代码层面。在其他高级语言中,Java 有类文件,Python 有 import 机制,Ruby 有 require,PHP 有 include 和 require。所以 JavaScript 开发人员不得不用命名空间等方式人为地约束代码,已达到安全和易用的目的。
变量污染
在文件形式上这些不同文件的 js 以不同的身份存在着的,但是一旦引入到同一个 index.html 文件之后,如果其中两个 js 文件中声明了同名变量 c ,由于 <script> 标签并不会为每个 js 文件单独划分私有作用域,它们被全部组织到一个作用域内,(可以把 index.html 看作一个作用域)。所以,在运行期间,浏览器将抛出 SyntaxError 错误,即变量 c 已被声明。
a.js 文件:
// a.js
let c = 10
b.js 文件:
// b.js
let c = 11
在 index.html 中引入 js 文件:
<script src="../../../static/js/chap06/a.js"></script>
<script src="../../../static/js/chap06/b.js"></script>
两个变量 c 声明冲突,所以抛出异常:
经过数年的发展后,Mozilla 工程师 Kevin Dangoor 在 2009年8 月,发布了 CommonJS 规范,它的出现是 JavaScript 发展的重要的里程碑。
Node.js 模块
在 JS 中,方法可以形成一个闭包,使该作用域内的所有变量、方法等都限定在区域内,外界无法直接访问到这个作用域中的东西。
一个 .js 文件就是一个模块。
let a = 10
let b = 5
module.exports.a = a
module.b = b
console.log(arguments)
console.log(arguments.callee())
实际上,我们写的所有内容都存放在一个函数里,Node.js 自动为我们封装函数内的代码。通过调用 arguments.callee() 可以获得当前正在执行的函数。
function (exports, require, module, __filename, __dirname) {
let a = 10
let b = 5
module.exports.a = a
exports.b = b
console.log(arguments)
console.log(arguments.callee + '')
}
Node.js 将模块放进了一个函数内,通过函数形成的闭包,避免变量污染等问题。
ES6 模块
现在,最新的浏览器开始原生支持模块功能了,并且 Node.js 也支持了 ES6 的模块机制了,前提是在 package.json 中有 "type": "module"。如果在 html 页面中引入了一个 .js 文件,并且文件中用到了 ES6 的模块机制,就必须在 script 标签中添加 type="module"。
export 为导出变量和方法,import 用于引入一个模块(.js 文件)。
export
export 可以一一地对变量和方法导出,也可以在文件最后用 {} 来一次性导出这些变量和方法。
一次性导出:
let a = 10
let b = 10
export {a, b}
或一一导出:
export let a = 10
export let b = 10
export 导出时,可以为这些变量和方法重命名。
export {a as _a, b as _b}
export default
export default 方式的导出在一个模块中只能有一个。
export default let msg = 'hello world!'
import
import 导入 export default 方式导出的变量不需要加 {}
,可以重命名;export 方式导出的需要加 {}
,也可以重命名。
import msg from 'b.js'
// import {default as msg} from 'b.js'
import {a, b} from 'a.js'
// import {a as _a, b as _b} from 'a.js'
NPM 包管理
Node 组织了自身的核心模块,也使得第三方文件模块可以有序地编写和使用。第三方模块中,模块与模块之间仍然是散列在各地的,相互之间不能直接引用。但是,包和NPM则是将模块联系起来的一种机制。包是在模块的基础上进一步组织 JavaScript 代码。
NPM 的意义
NPM 相当于 gem 之于 Ruby,Maven 之于 Java。对于 Node 而言,NPM 帮助完成了第三方模块的发布、安装和依赖等。借助 NPM,Node与第三方模块之间形成了很好的一个生态系统。
总结
Node 和 ES6 利用模块机制,弥补了 JavaScript 弱结构性的问题。NPM 通过对包规范的支持,有效地组织了第三方模块,项目开发中的依赖问题得到了很好的解决,并有效提供了分享和传播的平台。
Web 前端模块出现的原因,以及 Node.js 中的模块的更多相关文章
- node.js中express模块创建服务器和http模块客户端发请求
首先下载express模块,命令行输入 npm install express 1.node.js中express模块创建服务端 在js代码同文件位置新建一个文件夹(www_root),里面存放网页文 ...
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- node.js中net模块创建服务器和客户端(TCP)
node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...
- node.js中module模块的理解
node.js中使用CommonJS规范实现模块功能,一个单独的文件就是一个单独的模块.通过require方法实现模块间的依赖管理. 通过require加载模块,是同步操作. 加载流程如下: 1.找到 ...
- 前端走进机器学习生态,在 Node.js 中使用 Python
这次给大家带来一个好东西,它的主要用途就是能让大家在 Node.js 中使用 Python 的接口和函数.可能你看到这里会好奇,会疑惑,会不解,我 Node.js 大法那么好,干嘛要用 Python ...
- 在 Node.js 中引入模块:你所需要知道的一切都在这里
本文作者:Jacob Beltran 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58eaf471a58c240ae35bb ...
- Node.js中的模块接口module.exports浅析
在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.这里作者对此做了个简单 ...
- Node.js中的模块接口module.exports
在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.在此做了个简单的总结. ...
- [Web 前端] 使用yarn代替npm作为node.js的模块管理器
cp from : https://www.jianshu.com/p/bfe96f89da0e Fast, reliable, and secure dependency managemen ...
随机推荐
- 《Unix 网络编程》13:守护进程和 inetd 超级服务器
守护进程和 inetd 超级服务器 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
- Sec资产管理——SwebUI开源应用解决方案
产品简介 Sweb Sec是一款资产管理类的开源解决方案,通过SwebUI平台开发,包含资产管理.耗材管理两种管理系统,由部门管理.区域管理.盘点.标签打印.出入库等核心功能组成. 免费获取方案 开源 ...
- JS:变量的作用域
1.作用域: 指一个变量它在哪些代码范围能够被使用,这些地方就是变量的作用域 JS中的两种作用域: 1.全局作用域.2.函数作用域 2.在es5中 函数的代码块内部的代码 可以访问形参变量 也可 ...
- 使用 Cheat Engine 修改 Kingdom Rush 中的金钱、生命、星
最新博客链接 最近想学习一下 CE,刚好看见游戏库里装了 Kingdom Rush 就拿它来研究吧.这里写的东西,需要一些 Cheat Engine 的基础,可以看看教程. 这里主要是看写的注释,来理 ...
- NC200211 装备合成
NC200211 装备合成 题目 题目描述 牛牛有 \({x}\) 件材料 \({a}\) 和 \({y}\) 件材料 \({b}\) ,用 \({2}\) 件材料 \({a}\) 和 \({3}\) ...
- HTML 超文本标记语言 (Hyper Text Markup Language)
1.HTML是什么 HTML指的超文本标记语言(Hyper Text Markup Language),是一种用来描述网页的语言.超文本指的是除了可以包含文字之外,还可以包含图片.链接.音乐.视频.程 ...
- CADisplayLink、NSTimer循环引用解决方案
前言:CADisplayLink.NSTimer 循环引用问题 CADisplayLink.NSTimer会对Target产生强引用,如果target又对他们产生强引用,那么就会引发循环引用. @ ...
- vue2升级vue3指南(一)—— 环境准备和构建篇
1.nodejs和npm 注意二者的版本,版本过低需要升级,本人升级后的版本如下: $ node -v v16.15.1 $ npm -v 8.11.0 2.package.json 和依赖升级 由于 ...
- rust实战系列-base64编码
前言 某些只能使用ASCII字符的场景,往往需要传输非ASCII字符的数据,这时就需要一种编码可以将数据转换成ASCII字符,而base64编码就是其中一种. 编码原理很简单,将原始数据以3字节(24 ...
- DHCP 动态主机设置协议 分析
在TCP/IP网络中,每个接口都需要一个IP地址.子网掩码和广播地址( IPv6中没有),简单来说就是需要网络配置信息.如果想访问外部网络可以通过DNS获取外部地址,再通过路由间接转发出去.但是在&q ...