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中的内置模块

http://nodejs.cn/api/

【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:删除文件

  ...

原文地址:https://www.cnblogs.com/jiajialove/p/11493257.html

时间: 2024-08-03 22:59:51

Node基础-CommonJS模块化规范的相关文章

【Node.js】3.Node.js和commomJS规范

来源:http://javascript.ruanyifeng.com/ 目录 概述 module对象 module.exports属性 exports变量 AMD规范与CommonJS规范的兼容性 require命令 基本用法 加载规则 目录的加载规则 模块的缓存 环境变量NODE_PATH 模块的循环加载 require.main 模块的加载机制 require的内部处理流程 概述 Node程序由许多个模块组成,每个模块就是一个文件.Node模块采用了CommonJS规范. 根据Common

Javascript模块化编程系列三: CommonJS & AMD 模块化规范描述

CommonJS Module 规范 CommonJS 的模块化规范描述在Modules/1.1.1 中 目前实现此规格的包有: Yabble,CouchDB,Narwhal (0.2), Wakanda, TeaJS (formerly v8cgi), CommonScript, PINF JS Loader, SeaJS, ArangoDB, sorrow.js 注意,这里并没有找到 requireJS,因为它使用的是AMD规范. 此规范定义的具体内容包括: Requirerequire是一

JS模块化规范CMD之SeaJS

1. 在接触规范之前,我们用模块化来封装代码大多为如下: ;(function (形参模块名, 依赖项, 依赖项) { // 通过 形参模块名 修改模块 window.模块名 = 形参模块名 })(window.模块名 || {}, 依赖项, 依赖项) 分号是什么作用? 答:为了防止前面的代码没有添加分号造成语法解析错误,也可能会是 "!", "+" 等 为什么要将代码放入一个自执行函数中 答:为了避免全局命名空间污染,核心就是利用函数的私有作用域 为什么将依赖项作

JavaScript模块化规范

JavaScript模块化规范主要遵循CommonJS和AMD规范. CommonJS规范-服务器端JavaScript规范 Node.js是一个服务器端JavaScript项目,采用了CommonJS标准实现其模块系统. CommonJS中采用一个全局require方法来加载模块,主要由原生模块module来实现和完成,该模块在启动时已经被加载. 模块主要分为两类:原生模块,文件模块. 1.原生模块 原生模块也是Node.js中最核心的模块.原生模块在Node.js源代码编译的时候编译进了二进

CommonJs模块规范

1.什么是模块化 文件作用域 通信规则 加载 require 导出 exports 2.CommonJs模块规范 在Node中的Javascript还有一个很重要的概念:模块概念 模块作用域 使用require方法来加载模块 语法: var 自定义变量名称 = require('模块') 两个作用: 执行被加载模块中的代码 得到被加载模块中的exports导出接口对象 使用exports借口对象来导出模块中的成员 Node中的模块作用域,默认文件中所有的成员在当前文件模块有效 对于希望可以被其他

node.js的模块化开发

node.js的代码都是构建在模块化开发的基础之上,模块化开始也是node.js的核心之一. 传统非模块化开发的缺点:1.命名冲突   2.文件依赖 标准的模块化规范: 1.AMD -requirejs 2.CMD- seajs 模块化的规范定义的一些写代码的规则,只要遵循了同样的标准,基本上风格都是一致的 服务端的模块化规范: 1.Common.js  -Node.js 模块化相关的规则: 1.一个js文件 都是一个独立的模块,模块内部的成员都是相互独立的 2.模块化的导入和导出 案例1(ex

Javascript的AMD模块化规范详解

本文和大家分享的主要是Javascript中的AMD模块化规范相关内容,一起来看看吧,希望对大家学习javascript有所帮助. 现今通行的模块化规范有三种AMD.CMD和Commonjs(AMD和CMD是Commonjs衍生出来的模块化,Commonjs应该也是CMD) 服务器环境(CommonJs) 2009年,当nodejs被美国程序员Ryan Dah开发出来后,javascript也可以作为服务器端语言,开发服务器功能,但是为了解决服务器端的复杂性,开发Commonjs来使javasc

Javascript AMD模块化规范-备用

AMD是"Asynchronous Module Definition"的缩写,意思是"异步模块定义". 模块定义define(id?, dependencies?, factory); 其中: id: 模块标识,可以省略. dependencies: 所依赖的模块,可以省略. factory: 模块的实现,或者一个JavaScript对象. 代码示例1: 定义一个alpha模块,依赖require,exports,beta模块 define("alpha

node基础应用

node基础应用 API art-templat express mongoDB 1.概念 1.Node.js 基于javascript开发,运行在服务端. 2.事件驱动.非阻塞I/O 3.基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好. 2.实操 2.1 安装 node node 官网 检查是否安装成功 node -v /--version 2.2 简单使用 1.node和浏览器一样可以执行js文件 cmd 打开命令窗口 在终端输入 ` node 文件名.