Node基础-CommonJS模块化规范
1.在本地项目中基于NPM/YARN安装第三方模块
第一步:在本地项目中创建一个“package.json”的文件
作用:把当前项目所有依赖的第三方模块信息(包含:模块名称以及版本号等信息)都记录下来;可以在这里配置一些可执行的命令脚本等;基于YARN会默认生成一个“配置清单”,只是信息没有手动创建的全面
npm init -y 或者 yarn init -y
创建配置清单的时候,项目目录中不应该出现中文和特殊符号,这样有可能识别不了
第二步:安装
开发依赖:只有在项目开发阶段依赖的第三方模块
生产依赖:项目部署实施的时候,也需要依赖的第三方模块[npm]
npm install xxx --save 保存到配置清单的生产依赖中
--save-dev 保存到开发依赖中[yarn]
yarn add xxx 默认就是保存到生产依赖中
--dev / -D 保存到开发依赖中第三步:部署的时候“跑环境”
不要自己一个个的安装,只需要执行 npm install 或者 yarn install 即可,npm会自己先检测目录中是否有package.json文件,如果有的话,会按照文件中的配置清单依次安装
=>开发一个项目,我们生成一个配置清单“package.json”,当我们安装第三方模块使用的时候,把安装的模块信息记录到配置清单中,这样以后不管是团队协作开发还是项目部署上线,我们都没有必要把node_modules发文件发送给别人,只需要把配置清单传递给其它人即可,其他人拿到配置清单后,按照清单中依赖项及版本号,重新安装即可(重新安装:“跑环境”)
package.json
{
"name": "0609DAY1", //=>模块名称
"version": "1.0.0", //=>版本号
"description": "", //=>模块的描述
"main": "index.js", //=>当前模块的主入口文件
"dependencies": { //=>生产依赖
"zepto": "^1.2.0"
},
"devDependencies": { //=>开发依赖
},
"scripts": { //=>可执行脚本
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
2.安装在本地和全局的区别
[安装在全局的特点]
1.所有的项目都可以使用这个模块
->容易导致版本冲突
->安装在全局的模块,不能基于CommonJS模块规范调取使用(也就是不能在JS中通过REQUIRE调取使用)[安装在本地的特点]
1.只能当前项目使用这个模块
->不能直接的使用命令操作(安装在全局可以使用命令)
为啥安装在全局下可以使用命令?
npm root / -g 查看本地项目或者全局环境下,NPM的安装目录
安装在全局目录下的模块,但部分都会生成一个xxx.cmd的文件,只要有这个文件,那么xxx就是一个可执行的命令(例如:yarn.cmd => yarn就是命令)
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "%~dp0\node_modules\yarn\bin\yarn.js" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "%~dp0\node_modules\yarn\bin\yarn.js" %*
)
能否即安装在本地,也可以使用命令操作?
可以,但是需要配置package.json中的scripts
1.把模块安装在本地,如果是支持命令操作的(会在node_modules的bin中生成xxx.cmd的命令文件,只不过这个文件无法在全局下执行 =>不能直接用命令)
2.在package.json的scripts中配置需要执行的命令脚本
"scripts": {
"zxt": "lessc -v" 属性名自己设置即可,属性值是需要执行的命令脚本,根据需要自己编写(可以配置很多命令的)
}3.npm run zxt / yarn zxt 这样的操作就是把配置的脚本执行
->首先到配置清单的scripts中查找
->找到把后面对应的属性值(执行脚本)执行
->执行脚本的时候,会到本地node_modules中的bin文件加查找,没有的话,在向NPM安装的全局目录下查找
3.NODE入门
NODE本身是基于CommonJS模块规范设计的,所以模块是NODE的组成
- 内置模块:NODE天生提供给JS调取使用的
- 第三方模块:别人写好的,我们可以基于NPM安装使用
- 自定义模块:自己创建一些模块
CommonJS模块化设计的思想(AMD/CMD/ES6 MODULE都是模块设计思想)
1.CommonJS规定,每一个JS都是一个单独的模块(模块是私有的:里面涉及的值和变量以及函数等都是私有的,和其它JS文件中的内容是不冲突的)
2.CommonJS中可以允许模块中的方法互相的调用
B模块中想要调取A模块中的方法
=>A导出
=>B导入
[导出]
CommonJS给每一个模块(每个JS)中都设置了内置的变量/属性/方法
module:代表当前这个模块[object]
module.exports:模块的这个“属性”是用来导出当前模块的属性和方法的 [object]
exports:是内置的一个“变量”,也是用来导出当前模块属性方法的,虽然和module.exports不就是一个东西,但是对应的值是同一个(module.exports=exports 值都是对象)
[导入]
require:CommonJS提供的内置变量,用来导入模块的(其实导入的就是module.exports暴露出来的东西);导入的值也是[object]类型的;
CommonJS特点:
1. 所有代码都运行在模块作用域,不会污染全局作用域(每一个模块都是私有的,包括里面所有的东西也都是私有的,不会和其它模块产生干扰)
2. 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。(为了保证性能,减少模块代码重复执行的次数)
3. 模块加载的顺序,按照其在代码中出现的顺序。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。
案例:A/B/C三个模块
A中有一个sum方法:实现任意数求和
B中有一个avg方法:实现任意数求平均(先求和再求平均:B中用到A)
C中调取B中的avg,实现 12,23,34,45,56,67,78,89 求平均数
require导入规则
require('./xxx') 或者 ../xxx 再或者 /xxx,这种自己制定路径的模式,都是为了导入自定义的模块,换句话说,想要导入自定义的模块,必须加路径
require('xxx') 首先到当前项目的node_modules中查找是否存在这个模块,不存在找node提供的内置模块(导入第三方或者内置的)
__dirname:模块中这个内置变量是当前模块所在的绝对路径(具体到盘符:物理路径 例如:E:\201802LESSON\WEEK9\0609DAY1; 相对路径:WEEK9\0609DAY1 相对于根目录的路径;)
__filename:相对于__dirname来讲,多了模块名称,例如:E:\201802LESSON\WEEK9\0609DAY1\C.js
4.NODE中的内置模块
【fs内置模块:实现I/O操作】
let fs = require('fs');
1. fs.mkdir / fs.mkdirSync:创建文件夹,有Sync的是同步创建,反之没有是异步,想要实现无阻塞的I/O操作,我们一般都是用异步操作完成要处理的事情
2. fs.readdir / fs.readdirSync:读取文件目录中的内容
3. fs.rmdir :删除文件夹
4. fs.readFile:读取文件中的内容
5. fs.writeFile:向文件中写入内容(覆盖写入:写入的新内容会替换原有的内容)
6. fs.appendFile:追加写入新内容,原有的内容还在
7. fs.copyFile:拷贝文件到新的位置
8. fs.unlink:删除文件
...
Node基础-CommonJS模块化规范的更多相关文章
- Node.js实战项目学习系列(3) CommonJS 模块化规范
前言 想开始编写Node.js代码,那么我们就必须先熟悉它的模块化规范CommonJS,本文将详细讲解CommonJS规范 本文代码 >>> github 地址 CommonJS N ...
- CommonJs、AMD、CMD模块化规范
/** * CommonJS 模块化规范 * CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作 */ /*-------Node.js遵循Commonjs规范----- ...
- 走向Node与Webpack 之路 - CommonJS 模块化
走向Node与Webpack 之路 - CommonJS 模块化 1. 参考资料 JavaScript 标准参考教程(alpha) CommonJS规范(推荐 - 阮一峰写的) 官方网站 (看半天,不 ...
- 浅谈Node中的模块化
关于这篇文章早在去年年初的时候我就想写一片关于模块化的文章,但是推到现在才来完成也有很多好处,巩固之前对Node的理解.毕竟在我目前的项目中还没有一款项目是用到了Node开发,所以导致我对Node的一 ...
- 【Node.js】3.Node.js和commomJS规范
来源:http://javascript.ruanyifeng.com/ 目录 概述 module对象 module.exports属性 exports变量 AMD规范与CommonJS规范的兼容性 ...
- NodeJs的CommonJS模块规范
前言 本人记忆力一般,为了让自己理解<深入浅出Node.js-朴灵>一书,会在博客里记录一些关键知识,以后忘了也可以在这里找到,快速回想起来 Node通过require.exports.m ...
- Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述
CommonJS Module 规范 CommonJS 的模块化规范描述在Modules/1.1.1 中 目前实现此规格的包有: Yabble,CouchDB,Narwhal (0.2), Wakan ...
- CommonJs模块化(nodejs模块规范)
1.概述: Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. 如果想在多个 ...
- 05 ES6模块化规范基础详解
ES6模块规范 1.1 ES6规范说明 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来.其他语言都有这项功能,比如 Ru ...
随机推荐
- 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等
1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...
- 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示
手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...
- 从boosting谈起
Boosting 将一些表现效果一般(可能仅仅优于随机猜测)的模型通过特定方法进行组合来获得一个表现效果较好的模型.抽象地说,模型的训练过程是对一任意可导目标函数的优化过程. Adaptive boo ...
- Navicat连接MYsql报错
在Windows中安装mysql8后,使用Navicat连接数据库是出现“ Client does not support authentication protocol requested by s ...
- (三十)c#Winform自定义控件-文本框(三)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- springboot脚手架,逐渐成长成一个优秀的开源框架
目录 项目介绍 环境搭建 开发工具 开发环境 工具安装 系统架构 启动项目 springboot基于spring和mvc做了很多默认的封装.这样做的好处极大的方便了开发者的效率.尽管与此我们每个人还是 ...
- CentOS 安装 JDK 三种形式详细总结
一.下载 JDK 点击下载:jdk-8u211-linux-x64.tar.gz 根据需要选择对应版本和位数,并将文件放入CentOS中的相关目录中,以 /java/jdk 目录为例,执行 m ...
- 【redis】redis基础命令学习集合
写在前面 Redis是一个高速的内存数据库,它的应用十分广泛,可以说是服务端必学必精的东西.然而,学以致用,无用则无为.学了的东西必须反复的去用,去实践,方能有真知.这篇文章记录了我在redis学习过 ...
- 运行MonkeyRunner时使用Genymotion模拟器
Android自带的模拟器实在太慢太卡,远没有Genymotion的顺畅,所以找了一个办法,在启动py文件时使用Genymotion的模拟器 1.Genymotion安装完成之后,在Settings- ...
- python+Selenium-字符运行报错问题
最近开始接触自动化测试,在写一个简单的查询脚本时,遇到编码无法识别的问题 SyntaxError: Non-ASCII character '\xe5' in file F:/soft_Test/py ...