Node.js中require(http)无需npm安装可运行但require(express)报错原因
问题场景
通过npm init创建的简易项目初始目录结构如下:
- backend/
- httpserver.js
- package.json
最初在httpserver.js中编写的代码如下:
var http = require("http"); //create a server object: http .createServer(function (req, res) { res.writeHead(200, { "Content-Type": "text/html" }); // http header var url = req.url; if (url === "/about") { res.write("<h1>about us page<h1>"); //write a response res.end(); //end the response } else if (url === "/contact") { res.write("<h1>contact us page<h1>"); //write a response res.end(); //end the response } else { res.write("<h1>Hello World!<h1>"); //write a response res.end(); //end the response } }) .listen(3000, function () { console.log("server start at port 3000"); //the server object listens on port 3000 });
这段代码在未执行npm install、项目内不存在node_modules文件夹的情况下可以正常运行,和常规认知里Node项目需要安装依赖才能运行的印象不符。
后续删除httpserver.js文件,新建expserver.js文件,编写代码如下:
const express = require("express"); const app = express(); app.listen(8000, () => { console.log("Server running at 8000"); });
运行expserver.js时抛出错误:Cannot find module express。已知执行npm install express即可解决该问题,核心疑问为:为什么引入http模块时没有出现同类的模块找不到报错。
问题解答
两者的核心差异是模块的归属类型不同,Node.js的模块加载规则对不同类型的模块处理逻辑完全不一样:
http是Node.js官方内置的核心模块,随Node.js安装包一起部署到本地系统,不需要通过npm额外安装,也不会存放在项目的node_modules目录下。Node运行时遇到require引入核心模块的语句,会直接从Node自身的系统安装路径加载对应模块,完全不依赖项目本地的依赖目录,所以哪怕项目是空的、没有安装任何第三方包,也能正常引入调用。
除了http之外,fs、path、os、url等常用模块都属于Node内置核心模块,都可以直接引入使用。express是第三方开源模块,不属于Node.js官方内置的模块范围,不会随Node安装过程自带。Node运行时遇到require("express")的语句,会按照模块查找规则,优先遍历项目本地的node_modules目录、全局npm安装目录等位置查找对应包,没有提前执行npm install把express安装到对应查找路径下时,自然会抛出模块找不到的错误。
内容的提问来源于stack exchange,提问作者sabari
相关产品推荐
相关产品推荐

