zoukankan      html  css  js  c++  java
  • Node.js模块、包的学习笔记

    什么是模块

    模块是node应用程序的基本组成部分,文件和模块是一一对应的,就是说,一个node文件就是一个模块,这个文件可能是javascript代码、json或者是编译过的c++扩展等,如:

    	var http = require('http');
    

    其中http是node的一个核心模块,内部是c++实现的,外部是javascript封装起来的。我们通过require函数获取这个模块,然后才能使用其中的对象。

    • 创建模块
      在node中,一个文件就是一个模块,所以我们应该关注的问题是如何在其他的文件中获得这个模块。nodeJs提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的接口,即所获取模块的exports对象。
      例子:

        //name.js
        var name;
        
        exports.setName = function(thyName){
        	name = thyName;
        };
        
        exports.sayHello = function(){
        	console.log('Hello' + name);
        };
        //getname.js
        var myName = require('./hellonode');
        myName.setName('yehui');
        myName.sayHello();
      

    运行getname结果为:hello yehui

    • 单次加载
      require不会重复加载模块,无论调用多少次require,获得的模块都是同一个。

        var hello1 = require('./hellonode');
        hello1.setName('byyehui');
        
        var hello2 = require('./hellonode');
        hello2.setName('byyehui 2');
        
        hello1.sayHello();
        //by yehui 2
      

    这是因为hello1 和hello2 都指向同一个函数,后面的结果就覆盖了前面一个。

    • 覆盖exports

        function Hello(){
        	var name;
        
        	this.setName = function(thyname){
        		name = thyname;
        	};
        
        	this.sayHello = function(){
                console.log('hello' + name);
        	};
        };
        exports.Hello = Hello;
        //调用
        var Hello = require('./singleObject').Hello;
        hello = new Hello();
        hello.setName('yehui');
        hello.sayHello();
      

    这样的话,我们在其他文件里面就需要通过require('').Hello来获取Hello对象。
    但是如果我们把

    exports.Hello = Hello;
    //换成   
    module.exports = Hello;
    

    就可以直接用了

    var Hello = require('./singleObject');
    hello = new Hello();
    hello.setName('yehui');
    hello.sayHello();
    

    在外部引用模板时,其接口对象就是要输出Hello对象本身,而不是原先的exports。

    创建包

    包是在模块基础上更深一步的抽象,他将某个独立的功能封装起来,用于发布、更新、依赖管理和版本控制,node根据common JS规范实现了包机制,开发了npm来解决包的发布和获取需求。

    • node.js的包是一个目录,其中包含一个JSON格式的包说明文件package.json。严格符合commonJS的包规范应该具备以下特征:
    1. package.json必须在包的顶层目录;
    2. 二进制文件应该在bin目录下;
    3. javascript代码应该在lib目录下;
    4. 文档应该在doc目录下
    5. 单元测试应该在test目录下。

    但是node对包没那么严格,只需要package.json在顶层目录,并符合一些规则就行了。但是为了提高兼容性,还是严格一点较好。

    • 作为文件夹的模块
      模块和文件是一一对应的,文件不仅可以是javascript代码、二进制代码,还可以是一个文件夹。最简单的包就是一个作为文件夹的模块。如:我们先建一个nodelianxi的文件夹,在其中创建一个index.js:

        exports.hello = function(){
        	console.log('hello .');
        };
      

    然后在文件夹外面建立一个getpackage.js

    	var nodelianxi = require('./nodelianxi');
    	nodelianxi.hello();
        //hello .
    

    在这里我们可以把文件夹封装成模块,即所谓的包。包通常是一些模块的集合,在模块的基础上提供了更高曾的抽象,相当于提供了一个固定接口的函数库。

    • package.json
      package.json文件大概:

        {
            "main" : "./lib/inter.js"
        }
      

    node在调用包的时候,会首先检查包中package.json文件的main字段,将其作为包的接口模块,如果找不到package文件或main的话,会尝试寻找index.js或index.node作为包的接口。

    • Node.js包管理器
      即npm,是node官方提供的包管理工具,用于node包的发布、传播、依赖控制。npm提供了命令行工具,可以方便的下载、安装、升级、删除包,也可以维护包等。
    1. 获取一个包
      命令格式为:

       	npm [install/i] [package_name]
      

    如果你想安装express,可以这样:

    		$ npm install express
    		//或者
    		$ npm i express
    
    1. 本地模式和全局模式
      在使用npm包的时候,用两种模式:本地和全局
      全局语法格式:

       	npm [install/i] -g [package_name]
      
    2. 创建全局链接
      npm提供了一个npm link命令,他的功能是在本地包和全局包之间创建链接。我们知道使用全局模式安装的包不能直接通过require使用,但是这个命令打破了这个限制。

    3. 包的发布
      运行:

       	npm init
      

    在发布前,你还可以创建一个账号以后好管理你的包,使用npm adduser 根据提示就输入用户名、密码等就可以。完成后,使用npm whoami检测你是否已经获得账号。接下来,在package.json目录下运行nmp publish,就可以发布了,打开浏览器访问:http://search.npmjs.org/就可以看到自己发布的包了。如果你想更新你的包,只需要修改version字段,然后重新使用npm publish 就行了,还可以通过 npm unpublish来取消发布。

    调试

    • 单步调试
    1. 命令行调试
      执行:node debug xxxx.js,将启动调试工具。

    2. 远程调试
      在命令行中执行下面两个语句之一可以打开调试服务器:

       	node --debug[=port] script.js
       	node --debug-brk[=port] script.js
      
    • 使用eclipse调试node
  • 相关阅读:
    Selenium+java
    小白学习安全测试(一)——Http协议基础
    解决chrome运行报错unknown error: cannot get automation extension
    Eclipse 中 不能创建 Dynamic web project
    Jmeter遇到Connection reset by peer的解决方法
    用Java检测远程主机是否能被连接
    Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息
    jenkins的svn路径中文问题
    MySql的存储引擎介绍
    Netty SSL性能调优
  • 原文地址:https://www.cnblogs.com/yehui-mmd/p/6716007.html
Copyright © 2011-2022 走看看