nodejs 模块以及加载机制,主要讨论找不到模块的问题

  

  最主要的一个思想,加载模块无非就是找到模块在哪,只要清楚了模块的位置以及模块加载的逻辑那么找不到模块的问题就迎刃而解了。本文只是综合了自己所学的知识点进行总结,难免出现理解错误的地方,请见谅。

nodejs的模块分类

  1、原生模块:http  fs path等,这些模块都在源码包的lib目录下面,nodejs安装好之后是找不到这些模块的,都作为node.exe的一部分了,require这些模块永远没问题的,如果哪天出现问题了,直接重启电脑或者重装node。有什么疑问可以通过下载源码对这些原生模块的功能进行查看。地址:https://nodejs.org/download/

  2、文件模块:第三方模块,例如express等,通过npm安装的模块都是第三方模块。经常找不到的也是这些个模块了。

  3、文件模块:我们自己写的模块,之所以独立出来是因为其加载和另两种模块有区别。

怎样定义模块

  nodejs声明一个模块有2中做法

    exports.module_name

    module.exports

  关于这两个的区别也很简单,不过要讲明白很费劲,关键点在于知道有 module 这个全局变量的存在,打印出来并做几次尝试,就完全明白了,这里有一篇非常精彩  的关于这两者异同的文章:http://www.cnblogs.com/kongxianghai/p/3936197.html

第三方模块安装在哪(NPM)

  几条命令

npm config get/set prefix //查看设置全局安装目录,全局安装的模块就安装该目录下面的node_modules目录下

npm install [-g]  // -g 全局安装,模块将会安装到全局目录下。不带 -g 则直接安装在当前所在目录下,即为本地安装

模块的存在形式

  1、文件包含,这个比较直观,直接指定到文件名(去掉 .js 后缀),就可以得到文件里面所有导出的模块。

  2、文件夹包含,通过npm安装的第三方模块都是这种方式,指定到模块所在的文件夹,该文件夹就是模块名,以express为例:

    

    加载代码:var ex = require(‘express‘)

    加载机制:

      首先搜索当前目录下的 package.json 文件,查找里面的mian属性,如果存在,则加载该属性所指定的的文件。

      如果不存在 package.json 或者该文件里面没有main字段,nodejs将试图加载 index.js

      都不存在那么就只有说一声Cannot find module了。

模块在哪些地方搜索(针对第三方模块)

  1、逐级往上查找

    在此介绍一个全局变量  process   里面包含了nodejs进程运行的所有信息,在此打印一下 process.mianModule

    

    很明显,nodejs会从当前目录开始逐级往上搜索node_modules,找得到当然最好,找不到那么就会继续找node_path这个环境变量了。

  2、环境变量node_path

    如果环境变量中有node_path的存在,并且该变量的值为全局安装的目录,那么也不会出现找不到模块的错。

    关于eclipse、sublime等IDE的node_path没有问题,如果遇到的话,可以给它们单独配置。当然,插件得先装好啊。

    eclipse

    右键 -> Run As -> Run Configurations... 找到下面的界面

    

    Sublime

    Preferences -> Package Settings -> Nodejs -> Settings-Default

    

    填一下node_path

require(‘这里应该怎么填‘)

  1、相对路径指定模块,一般用于加载自己的模块。

    必须用到的符号: ./ 表示当前目录,相对路径所相对的就是当前的目录

                  ../ 表示上一级模块,可以无限使用直到跳转到根目录

    这两个符号必须以其中一个开头,比如想加载当前目录下的另一模块,假设文件名为 hello.js 当前所在文件为 hi.js 我们需要在hi.js文件中这样写:

    var hello = require(‘./hello‘)//变量名随意,一般惯用文件名

    在此基础上,再加入文件夹的名字,我们就可以加载到我们自己所写的任意模块了。

  2、绝对路径指定模块地址,除了原生模块之外,任何文件模块都可以加载到,除非路径出错了。比如我们可以这样子加载express模块,以我的express模块所在路径为例。

  

  这种情况下,还可以给express随便改名字,比如我把express的文件夹名改为ex

  var ex = require(‘F:\\nodejs\\node_modules\\ex‘)

  也是可以的。

  3、直接使用 require(‘xxx‘) 那么所加载的模块要么是原生模块,要么该模块在某个node_modules目录下面

    

    

时间: 2024-10-15 12:58:23

nodejs 模块以及加载机制,主要讨论找不到模块的问题的相关文章

Python模块动态加载机制

本文和大家分享的主要是python中模块动态加载机制相关内容,一起来看看吧,希望对大家学习python有所帮助. import 指令 来看看 import sys 所产生的指令: co_consts : (0, None) co_names : ('sys',) 0 LOAD_CONST               0 (0) 2 LOAD_CONST               1 (None) 4 IMPORT_NAME              0 (sys) 6 STORE_NAME  

293 Node.js中模块的加载机制

原文地址:https://www.cnblogs.com/jianjie/p/12330578.html

Angular Material串串学客户端开发 2 - Node.js模块加载机制Require()

题外话解一下博客标题,因为第一篇文章评论中,有人质疑离题很远,说了半天和Angular Material没有半毛关系.其实我的的中心在后半句<串串学客户端开发>. require() 不要把这里的Require()和RequireJS混为一谈.不过有意思的是,Typescript的模块定义,甚至同时支持这两种模块机制. 导入和使用外部模块,只是简单的一句require(),看看angular/material/docs下的编译文件gulpfile.js的代码片段.对模块导入和使用有个直观的感觉

模块加载机制与包的加载机制

模块加载机制 包是更好的组织功能的代码结构 当前指定一个文件夹,会将文件夹内的index.js作为程序的入口    3 如果当前目录下有一个和文件夹同名的文件,优先加载文件        1 如果当前目录下有一个和文件夹同名的json文件,优先加载json  2 对于文件的加载,顺序是,如果你写上./xxx,优先会加载xxx.js/xxx.json/xxx.node 加载优先级,例如: ./abc 1:先检查当前目录下./abc目录中的package.json文件的main属性,满足就立刻加载

《python解释器源码剖析》第15章--python模块的动态加载机制

15.0 序 在之前的章节中,我们考察的东西都是局限在一个模块(在python中就是module)内.然而现实中,程序不可能只有一个模块,更多情况下一个程序会有多个模块,而模块之间存在着引用和交互,这些引用和交互也是程序的一个重要的组成部分.本章剖析的就是在python中,一个模块是如何加载.并引用另一个模块的功能的.对于一个模块,肯定要先从硬盘加载到内存. 15.1 import前奏曲 我们以一个简单的import为序幕 # a.py import sys 1 0 LOAD_CONST 0 (

python模块与包加载机制

模块的搜索路径: When a module named spam is imported, the interpreter searches for a file named spam.py in the current directory, and then in the list of directories specified by the environment variable PYTHONPATH. This has the same syntax as the shell var

(14)oddo加载机制

Odoo的启动通过openerp-server脚本完成,它是系统的入口. 然后加载配置文件openerp-server.conf 或者 .openerp_serverrc: openerp-server.conf的主要内容: 这个文件缺省是没有的,Odoo系统会有一个默认值,但是一般情况我们都需配置这个文件.启动http服务器,监听端口. 模块加载: 模块加载外层就是封装一个Registry(Mapping)对象:实际是一个字典,它包含对应的db,model等映射关系,一个DB对应一个Regis

PHP autoload与spl_autoload自动加载机制的深入理解

PHP autoload与spl_autoload自动加载机制的深入理解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-05我要评论 本篇文章是对PHP中的autoload与spl_autoload自动加载机制进行了详细的分析介绍,需要的朋友参考下 PHP autoload机制详解(1) autoload机制概述在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利.这 也是OO设计的基本思想

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了更好地阅读本文,你需要先阅读Android apk动态加载机制的研究这篇文章,在此文中,博主分析了Android中apk的动态加载机制,并在文章的最后指出需要解决的两个复杂问题:资源的访问和activity生命周期的管理,而本文将会分析这两个复杂问题的解决方法.需要说明的一点是,我们不可能调起任何一个未安装的