Nodejs的模块化

1. Node.js中的模块化简介

  • 为什么Node.js中需要模块化

      在后台开发语言中,比如Java、C#。他们都是隐含模块化的,Node.js默认帮我们提供了模块化这种机制。
      在服务器端,我们想要使用底层的一些功能需要导入一些“包”来对其操作,比如操作文件、网络需要导入对应的包。其它语言中都是基于类来实现的模块化的思想,使用类来组织文件和文件之间的关联。
      而Node.js中使用的是JavaScript语言,ECMAScript仅仅规定了基本的语法的书写,并没有规定文件之间
    关联,也就是说每个js文件之间是独立的,Node.js已经帮我们实现了js文件之间的关联(模块化)
      Node.js中的模块化是基于CommonJS规范的
    
  • JavaScript的局限性
    • 没有模块系统
    • 系统提供的接口较少,比如:缺少操作文件、I/O流等常用的接口
    • 没有标准接口,缺少如web服务器、数据库等统一接口
    • 缺乏管理系统导师JavaScript应用中基本没有自动加载和安装依赖的能力
  • CommonJS规范
    • Node.js开发之初遵守了CommonJS规范
    • 使JavaScript达到像Java、Python、PHP等语言一样有开发大型应用的基本能力
    • CommonJS规范规定每一个模块都有一个单独的作用域
    • CommonJS规范规定每个模块对外公布的成员使用module.exports或者exports
    • 有了模块化系统之后,Node.js提供了许多系统模块:文件、Buffer、I/O流、Socket等

2. Node.js的核心模块

  • 使用核心模块之前首先要导入模块
  • path模块
    • 导入模块 var path = require("path");
    • basename() 获取文件名+后缀
          path.basename("/foo/hello/world/123.html")
          //第二个参数,去掉获取的文件名中的相同部分
          path.basename("c:/foo/hello/world/123.html",".html")
      
    • dirname() 获取目录
         path.dirname("/foo/hello/world/123.html")
      
    • extname() 获取文件的扩展名
        path.extname("/foo/hello/world/123.html")
      
    • join() 合并路径
           var p1 = "c://abc/xyz";
           var p2 = "/123/456";
           console.log(path.join(p1,p2));
      
    • parse() 把路径转换为一个对象
        path.parse("c:\\home\\hello\\world\\123.html")
      
        { root: ‘c:/‘,
          dir: ‘c://home/hello/world‘,
          base: ‘123.html‘,
          ext: ‘.html‘,
          name: ‘123‘ }
      
    • format() 把一个路径对象转换成一个路径字符串
        var obj = { root: ‘c:\\‘,
            dir: ‘c:\\home\\hello\\world‘,
            base: ‘123.html‘,
            ext: ‘.html‘,
            name: ‘123‘ }
      
        console.log(path.format(obj));
      
    • delimiter 环境变量的分隔符,可以跨平台 windows下是; 其它平台 :
    • path.sep 路径的分隔符 windows下是\ 其它下是/
    • isAbsolute() 是否是绝对路径
  • url模块

    • 导入模块 var url = require("url");
    • parse() 把字符串的路径转换成对象
        var uri = "http://www.baidu.com:8080/images/1.jpg?version=1.0&time=1123#abcd";
        console.log(url.parse(uri));
      
    • format() 把路径对象转换成字符串
        var obj =  {
            protocol: ‘http:‘,
            slashes: true,
            auth: null,
            host: ‘www.baidu.com:8080‘,
            port: ‘8080‘,
            hostname: ‘www.baidu.com‘,
            hash: ‘#abcd‘,
            search: ‘?version=1.0&time=1123‘,
            query: ‘version=1.0&time=1123‘,
            pathname: ‘/images/1.jpg‘,
            path: ‘/images/1.jpg?version=1.0&time=1123‘,
            href: ‘http://www.baidu.com:8080/images/1.jpg?version=1.0&time=1123#abcd‘ };
      
        var str = url.format(obj);
        console.log(str);
      
  • querystring模块

    • 导入模块 var querystring = require("querystring");
    • parse() 把参数字符串解析成对象
        var obj = querystring.parse("version=1.0&time=123");
        console.log(obj);
      
    • stringify() 把一个对象转换成一个字符串
    • escape() url进行编码
    • unescape() url进行解码

3. 核心模块存在哪里?

  • 核心模块存储在node.exe中,当node.exe运行的时候,核心模块会被加载,require的时候会加载到内存
  • 在github上可以找到源代码,lib文件夹下
  • 核心模块的执行速度比较快

4. 文件模块(自定义模块)

  • 定义文件模块 add.js

              function add(a,b) {
                  return a + b;
              }
              //导出成员
              exports.add = add;
              //module.exports.add = add;
    
  • 使用文件模块 main.js
              var obj = require("./add.js");
              console.log(obj.add(5,6));
    
    • 注意引用js的方式和核心模块不同

            //使用相对于main.js 的方式查找add.js
            var obj = require("./add.js");
            var obj = require("./add");
            //下面这种方式是引用核心模块或者包
            //var obj = require("add");
      

5. 包

  • CommonJS的包规范给程序员提供了组织模块的标准,减少沟通成本
  • 包的使用:
    • 所有模块放在一个文件夹(包名)
    • 包放在当前项目中的node_modules文件夹下
    • 包中定义一个index.js(文件名不可以更改)导出所有模块
    • 引用包(约定大于配置)
  • 导入包的执行过程 require("calc")
    • 将calc当做核心模块加载,加载不成功
    • 自动去当前目录中的node_modules中找文件名为calc的包
    • 自动去calc找index.js的出口模块(导出的模块)
    • 如果找不到index.js报错,如果想要改出口模块,需要package.json配置文件
  • package.js
名称 功能
name 包名称
description 包介绍,介绍包的功能
version 版本号,用于版本控制
keywords 关键词数组,用于在npm中搜索
main require引入包时优先检查此字段
dependencies 标记当前包所依赖的包列表,npm会自动加载依赖的包
Author 包作者
License 开源许可
{
  "name": "calcpack",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {   //可以通过npm run来执行
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
  • 创建包的标准方式

    • npm init -y 自动创建package.json
  • 一个标准包的结构

名称 |功能 |---|---| package.js |包描述文件 bin |存放可执行文件 lib |存放JavaScript代码 doc |存放文档 test |存放单元测试用例代码 README.md |说明文档,描述包的作用和用法

  • 标准包执行过程

    • 将calcpack当做核心模块加载,加载不成功
    • 自动去当前目录中的node_modules中找文件名为calcpack的包
    • 如果在calcpack中有package.json的话,并且指定了main属性的值,优先加载main指定的.js模块(出口模块)
    • 如果没有package.json,或没有指定main属性,自动去calcpack找index.js的出口模块(导出的模块)
    • 如果找不到index.js报错

6. 发布包

  • 把包发布到NPM官网 https://www.npmjs.com/

    • 建立一个包,设置package.json
    • 在npmjs中注册账号
    • 在包的根目录下执行
      • npm adduser 添加发布包的用户信息,登录网站
      • npm publish 发布或者更新包 package.json中一定要指定 maintainers:[{
          "name":"nllcode",
          "email":"[email protected]"
        

        }]

      • npm cache clear 清除npm本地缓存,用于对使用相同版本号发布新版本
      • npm unpublish @ 删除发布过的版本代码 npm unpublish [email protected]
  • 错误

  • 安装包

    • 从网络安装

      • 当前目录安装 npm install 包名
      • 全局安装 npm install 包名 -g
    • 本地安装 npm install 包的路径
    • 卸载包 npm uninstall 包名
  • require()加载规则
    • 优先从缓存加载模块或者包
    • 加载文件模块要使用相对路径 ./ ../
    • 文件模块的加载可以不写后缀名,如果不写后缀名按照 .js > .node > .json的顺序加载
    • 加载json文件,推荐写上后缀.json
    • 加载核心模块或包,不写路径和后缀
    • module.paths 加载node_modules的时候,按此数组的顺序加载
时间: 2024-10-20 18:57:45

Nodejs的模块化的相关文章

浅析 Nodejs 模块化

本文只讨论 CommonJS 规范,不涉及 ESM 我们知道 JavaScript 这门语言诞生之初主要是为了完成网页上表单的一些规则校验以及动画制作,所以布兰登.艾奇(Brendan Eich)只花了一周多就把 JavaScript 设计出来了.可以说 JavaScript 从出生开始就带着许多缺陷和缺点,这一点一直被其他语言的编程者所嘲笑.随着 BS 开发模式渐渐地火了起来,JavaScript 所要承担的责任也越来越大,ECMA 接手标准化之后也渐渐的开始完善了起来. 在 ES 6 之前,

Nodejs学习路线图

Reference: http://mp.weixin.qq.com/s?src=3&timestamp=1463322948&ver=1&signature=aIZC*rkx9fSa5Z0bQmJfN0bumnigT7UFSUmp1BvWxxEgAwyA8zeRcsDcGGkpOaGxge8FC*dz9PzGh5C0bpz5efM8ph146Lcqp29w7Ss3DrEtj3PVu1G2185kdi42NJzV1wxSuO*xjZ2X4giQnPwKtg== Node.js框架是

NodeAsp——像开发NodeJS应用一样玩转ASP

NodeAsp是一套Classic ASP框架,借鉴了NodeJS的模块化思想,让您可以使用全新的理念愉快地书写ASP程序. NodeAsp使用遵循CommonJS规范的require,完全兼容NodeJS模块加载方式,让您可以直接使用NodeJS 50%以上的模块.一切不关乎NodeJS运行环境和ES5-ES6特有对象的模块都能直接使用.如此庞大的模块资源库,这在以往任何ASP框架下都是没有的. NodeAsp是ASP领域独树一帜的创新性框架,她的出现改变了传统的ASP编写模式,让您只需要会j

[转载]Nodejs学习路线图——nodejs系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 程序员Java,R,PHP,Java

15个Nodejs应用场景

15个Nodejs应用场景 我们已经对Nodejs有了初步的了解,接下来看看Nodejs的应用场景. 2.1 Web开发:Express + EJS + Mongoose/MySQL express 是轻量灵活的Nodejs Web应用框架,它可以快速地搭建网站.Express框架建立在Nodejs内置的Http模块上,并对Http模块再包装,从而实际Web请求处理的功能. ejs是一个嵌入的Javascript模板引擎,通过编译生成HTML的代码. mongoose 是MongoDB的对象模型

[转载]服务器管理模块forever——Nodejs中间件系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 程序员Java,R,PHP,Java

nodeJs学习路线

转载自:http://blog.fens.me/nodejs-roadmap/ 前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个. 和全部人一样,我也从Web开发開始.然后到包管理,再到应用系统的开发,最后开源自己的Nodejs项目.一路走来,Nodejs已经成为我做Web项目的标配.我非常愿意把原Java.PHP的Web系统向Nodejs迁移.由于1个人能够非常easy的完毕10个人的活了. 本文把我的学习和使用经验进行归纳总结,希望给新入门No

ES6入门十二:Module(模块化)

webpack4打包配置babel7转码ES6 Module语法与API的使用 import() Module加载实现原理 Commonjs规范的模块与ES6模块的差异 ES6模块与Nodejs模块相互加载 模块循环加载 一.webpack4打包配置babel7转码ES6 1.webpack.config.js 在webpack中配置babel转码其实就是在我之前的webpack配置解析基础上添加babel的加载器,babel的具体转码配置在之前也有一篇详细的博客做了解析: webpack安装与

搭建Windows Node.js环境

利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站 这里介绍如何搭建Node.js Windows环境 第一步:下载并执行Node.js Windows Installer (.msi) (V