Node.js轻松学(基础篇)笔记

Node.js基础到高级运用】二、搭建开发环境 恭喜你,现在你已经成功搭建了Node.js的开发环境,并且会了如何管理不同的Node.js版本。这些技能将为你的Node.js开发之旅打下坚实的基础。在下一文章中,我们将深入探讨JavaScript的核心概念,以及它们在Node.js中的应用。继续保持习的热情,我们很快就会见到! 阅读详情

#1 课程介绍与开发环境搭建

  • terminal插件:可以在终端打开文件

#2 全局对象

  • 浏览器中的全局对象:window,里面有方法console.log(),setTimeout()等
console.log(__dirname);   //输出当前目录名
console.log(__filename);   //输出文件名

// require exports

var time = 0;

setTimeout(() =>{
    console.log("3 seconds have passed");
}, 3000);

var timer = setInterval(function() {    //循环输出
    time += 2;
    console.log(time + " seconds have passed");
    if (time > 5) {
        clearInterval(timer);
    }
}, 2000);

#3 回调函数

  • 一般函数的定义
function sayHi() {
    console.log('Hi');
}

var sayBye = function() {
    console.log('Bye');
}

sayHi();
sayBye();
  • 回调函数
function callFunction(fun) {
    fun();
}

function callFunction(fun,param) {
    fun(param);
}

callFunction(function(param){
    //TODO
},param)

#4 模块

module.exports = func_name;
var func = require('./filename');

//暴露出一个对象
module.exports.func1 = func1_name;
module.exports.func2 = func2_name;
module.exports.func3 = func3_name;
var stuff = require('./filename');
stuff.func1();

module.exports = {
    func1: func1_name;
    func2: func2_name;
    func3: func3_name;
}
var func1 = require('./count').pi;

#5 事件

  • 用户点击触发事件
element.on('click',function() {
    console.log('clicked');
})
  • nodejs中触发事件
var events = require('events');
var util = require('util');
var myEmitter = new events.EventEmitter();
myEmitter.on('eventName',function(param) {   
    console.log(param)
})
myEmitter.emit('eventName',param);



var events = require('events');
var util = require('util');    //nodejs工具库

var Person = function(name) {
    this.name = name
}

util.inherits(Person, events.EventEmitter);    //继承类

var xiaoming = new Person('xiaoming');
var lili = new Person('lili');
var lucy = new Person('lucy');

var person = [xiaoming, lili, lucy];

person.forEach(function(person)    //循环遍历
    person.on('speak', function(message) {     //事件绑定
        console.log(person.name + " said: " + message);
    })
})

xiaoming.emit('speak', 'hi');     //事件触发
lucy.emit('speak', 'I want a curry');

#6 读写文件(同步,异步)

  • 同步:按代码顺序,从上到下依次执行,等上一个文件加载完才能加载下一个
  • 异步:按加载顺序执行
  • nodejs在执行JavaScript的时候是单线程的(!nodejs并不是单线程的
    • nodejs维护了一个事件队列,读到事件时就会储存到事件队列中,当主线程空闲时会先向下执行,发起另一个线程去执行耗时的操作,执行成功后再通知主线程
    • nodejs高性能,因为各步操作是可异步的
    • 注意,异步的方法都要加回调函数
/*同步*/
//读文件
var fs = require('fs');
var readMe = fs.readFileSync("readMe","utf8");   //文件名,编码

//写文件
fs.writeFileSync("wtiteMe.txr",readMe);  //文件名,文件内容


/*异步*/
var fs = require('fs');
var readMe = fs.readFile("readMe","utf8",function(err,data) {  //文件名,编码,回调函数
    console.log(data);
});  
var writeMe = fs.writeFile('writeMe.txt',function() {  //文件名,编码,回调函数
    console.log("content");
});  

#7 创建和删除目录

var fs = require('fs');
fs.unlink("writeMe.txt",function() {         //异步删除
    console.log("delete writeMe.txt file");
})

fs.mkdirSync('stuff');   //同步 创建目录
fs.mkdir('stuff',function() {    //异步 复制文件
    fs.readFile('readMe.txt','utf8',function(err,data) {
        fs.writeFile('./stuff/writeMe.txt',data,function() {
            console.log('copy successfully');
        })
    })
});

#8 流和管道

  • 处理数据,将文件储存成一个个buffer来处理
  • 提高性能
  • 是一个事件的实例
var fs = require('fs');

var myReadStream = fs.createReadStream(_dirname + '/readMe.txt');
myReadStream.setEncoding("utf8");   //单独设置编码格式

var myReadStream = fs.createReadStream(__dirname + '/readMe.txt','utf8'); //直接设置编码格式
var myWriteStream = fs.createWriteStream(__dirname + '/writeMe.txt');

var data = ""

var writeData = "hello world";
myWriteStream.write(writeData);
myWriteStream.end();
myWriteStream.on('finish',function() {  //设置一个监听方法,在结束时提醒
    console.log('finished');
})

myReadStream.on('data',function(chunk) {
    data += chunk;
   myWriteStream(chunk);
})

myReadStream.on('end',function() {
    console.log(data);
})
  • 使用管道的方式复制粘贴文件
var fs = require('fs');

var myReadStream = fs.createReadStream(_dirname + '/readMe.txt');
myReadStream.setEncoding("utf8");   //单独设置编码格式

var myReadStream = fs.createReadStream(__dirname + '/readMe.txt','utf8'); //直接设置编码格式
var myWriteStream = fs.createWriteStream(__dirname + '/writeMe.txt');

myReadStream.pipe(myWriteStream);
// 解压
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');

var password = new Buffer(process.env.PASS || 'password');
var decryptStream = crypto.createDecipher('aes-256-cbc', password);

var gzip = zlib.createGunzip();
var readStream = fs.createReadStream(__dirname + '/out.gz');

readStream // reads current file
    .pipe(gzip) // uncompresses
    .pipe(decryptStream) // decrypts
    .pipe(process.stdout) // writes to terminal
    .on('finish', function() { // finished
        console.log('done');
    });

// 压缩
var crypto = require('crypto');
var fs = require('fs');
var zlib = require('zlib');

var password = new Buffer(process.env.PASS || 'password');
var encryptStream = crypto.createCipher('aes-256-cbc', password);

var gzip = zlib.createGzip();
var readStream = fs.createReadStream(__dirname + "/readMe.txt"); // current file
var writeStream = fs.createWriteStream(__dirname + '/out.gz');

readStream // reads current file
    .pipe(encryptStream) // encrypts
    .pipe(gzip) // compresses
    .pipe(writeStream) // writes to out file
    .on('finish', function() { // all done
        console.log('done');
    });
  • ls | grep app 这个命令在Linux和mac才合适,或者Windows的Git bash

#9 web服务器part 1介绍

var http = require('http');

var onRequest = function(request,response) {
    console.log('Request received')
    response.writeHead(200,{'Content-Type':'text/plain'});
    response.write('Hello from out application');
    response.end();
}
    
var server = http.createServer(onRequest);

server.listen(3000'127.0.0.1');
console.log('Server started on localhost port 3000');

#10 web服务器part 2 响应JSON

var http = require('http');

var onRequest = function(request,response) {
    console.log('Request received')
    response.writeHead(200,{'Content-Type':'application/json'});
    var myObj = {
        name:"name",
        job:"programmer",
        age:18
    };
    response.end(JSON.stringify(myObj));   
}
    
var server = http.createServer(onRequest);

server.listen(3000'127.0.0.1');
console.log('Server started on localhost port 3000');

JSON.parse(JSON.stringify(myObj)); //JSON的序列化和反序列化

#11 web服务器part 3 响应HTML页面

var http = require('http');

var onRequest = function(request,response) {
    console.log('Request received')
    response.writeHead(200,{'Content-Type':'text/html'});
    var htmlFile ='<!DOCTYPE html>' +
					'<html lang="en">' +
						'<head>' +
   							 '<meta charset="UTF-8">' +
  							  '<meta name="viewport" content="width=device-width, '+
    								'initial-scale=1.0">' +
    						  '<meta http-equiv="X-UA-Compatible" content="ie=edge">' +
    					      '<title>Document</title>' +
						'</head>' + 
                        '<body>' +
                        '</body>' +
                        '</html>'
    response.end(htmlFile);   
}
    
var server = http.createServer(onRequest);

server.listen(3000'127.0.0.1');
console.log('Server started on localhost port 3000');
  • 利用流和管道响应HTML页面
var http = require('http');
var fs = require('fs');

var onRequest = function(request,response) {
    console.log('Request received')
    response.writeHead(200,{'Content-Type':'text/html'});
    var myReadStream = fs.createReadStream(__dirname + '/index.html','utf8');
    myReadStream.pipe(response);
}
    
var server = http.createServer(onRequest);

server.listen(3000'127.0.0.1');
console.log('Server started on localhost port 3000');

#12 web服务器part 4 用模块化思想组织代码

//server.js

var http = require('http');
var fs = require('fs');

function startServer() {
    var onRequest = function(request,response) {
    console.log('Request received')
    response.writeHead(200,{'Content-Type':'text/html'});
    var myReadStream = fs.createReadStream(__dirname + '/index.html','utf8');
    myReadStream.pipe(response);
	}
    
	var server = http.createServer(onRequest);

	server.listen(3000'127.0.0.1');
	console.log('Server started on localhost port 3000');
}

exports.startServer = startServer;
//app.js

var server = require('./server');
server.startServer();

#13 web服务器 part 5 路由

var http = require('http');
var fs = require('fs');

function startServer() {
    var onRequest = function(request, response) {
        console.log('Request received ' + request.url);
        if (request.url === '/' || request.url === '/home') {
            response.writeHead(200, { 'Content-Type': 'text/html' });
            fs.createReadStream(__dirname + '/index.html', 'utf8').pipe(response);
        } else if (request.url === '/review') {
            response.writeHead(200, { 'Content-Type': 'text/html' });
            fs.createReadStream(__dirname + '/review.html', 'utf8').pipe(response);
        } else if (request.url === '/api/v1/records') {
            response.writeHead(200, { 'Content-Type': 'application/json' });
            var jsonObj = {
                name: "hfpp2012"
            };
            response.end(JSON.stringify(jsonObj));
        } else {
            response.writeHead(404, { 'Content-Type': 'text/html' });
            fs.createReadStream(__dirname + '/404.html', 'utf8').pipe(response);
        }
    }

    var server = http.createServer(onRequest);

    server.listen(3000, '127.0.0.1');
    console.log('Server started on localhost port 3000');
}

exports.startServer = startServer;

#14 web服务器 part 6 重构路由代码

//router.js

var fs = require('fs');

function route(handle,pathname,response){
    console.log('Routing a request for ' + pathname);
    if(typeof handle[pathname] === 'function') {
        handle[pathname](response);
    } else {
        response.writeHead(200,{'Content-Type':'text/html'});
    fs.createReadStream(__dirname + '/404.httml','utf8').pipe(response);
    }
}

module.exports.route = route;
//handler.js

var fs = require('fs');

function home(response) {
    response.writeHead(200,{'Content-Type':'text/html'});
    fs.createReadStream(__dirname + '/index.httml','utf8').pipe(response);
}

function review(response) {
    response.writeHead(200,{'Content-Type':'text/html'});
    fs.createReadStream(__dirname + '/review.httml','utf8').pipe(response);
}

function api_records(response) {
    response.writeHead(200, { 'Content-Type': 'application/json' });
    var jsonObj = {
        name: "hfpp2012"
    };
    response.end(JSON.stringify(jsonObj));
}

module.exports = {
    home : home,
    review : review,
    api_records : api_records
}
//server.js

var http = require('http');
var fs = require('fs');

function startServer(route,handle) {
    var onRequest = function(request, response) {
        console.log('Request received ' + request.url);
        route(handle,request.url,response);
    }

    var server = http.createServer(onRequest);

    server.listen(3000, '127.0.0.1');
    console.log('Server started on localhost port 3000');
}

module.exports.startServer = startServer;
//app.js

var server = require('./server');
var router = require('./router');
var handler = require('./handler');

var handle = {};
handle['/'] = handler.home ;
handle['/home'] = handler.home ;
handle['/review'] = handler.review ;
handle['/api/v1/records'] = handler.api_records ;

server.startServer(router.route,handle);

#15 web服务器 part 7 使用GET或POST请求发送数据

  • GET方法:一般用于查询
  • POST方法:一般用于提交

GET演示:

//server.js

var http = require('http');
var fs = require('fs');
var url = require('url');

function startServer(route,handle) {
    var onRequest = function(request, response) {
        var pathname = function(request.url).pathname;
        console.log('Request received ' + request.url);
        var params = url.parse(request.url,true).query;   //取get传递的参数
        route(handle,pathname,response,params);
    }

    var server = http.createServer(onRequest);

    server.listen(3000, '127.0.0.1');
    console.log('Server started on localhost port 3000');
}

module.exports.startServer = startServer;
//router.js

var fs = require('fs');

function route(handle,pathname,response,params){
    console.log('Routing a request for ' + pathname);
    if(typeof handle[pathname] === 'function') {
        handle[pathname](response,params);
    } else {
        response.writeHead(200,{'Content-Type':'text/html'});
    fs.createReadStream(__dirname + '/404.httml','utf8').pipe(response);
    }
}

module.exports.route = route;
//handler.js

var fs = require('fs');

function home(response) {
    response.writeHead(200,{'Content-Type':'text/html'});
    fs.createReadStream(__dirname + '/index.httml','utf8').pipe(response);
}

function review(response) {
    response.writeHead(200,{'Content-Type':'text/html'});
    fs.createReadStream(__dirname + '/review.httml','utf8').pipe(response);
}

function api_records(response,params) {
    response.writeHead(200, { 'Content-Type': 'application/json' });
    response.end(JSON.stringify(params));
}

module.exports = {
    home : home,
    review : review,
    api_records : api_records
}

POST演示:

//一个表单
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>hfpp2012</title>
</head>

<body>
    <form action="/api/v1/records" method="post">
        name: <input type="text" name="name" /> age: <input type="text" name="age" />
        <input type="submit" value="Submit">
    </form>
</body>

</html>
//server.js

var http = require('http');
var fs = require('fs');
var url = require('url');
var querystring = require('querystring');

function startServer(route,handle) {
    var onRequest = function(request, response) {
        var pathname = function(request.url).pathname;
        console.log('Request received ' + request.url);
        //var data = "";
        var data = [];
        request.on("error",function(err) {
            console.error(err);
        }).on("data",function(chunk) {
            //data += chunk;
            data.push(chunk);
        }).on('end',function() {
            if(request.method === "POST") {
                if (data.length > 1e6) {       //传送数据量过大时,取消该请求
                    request.connection.destory();
                }
                data = Buffer.concat(data).toString();
                route(handle,pathname,response,parse(data));
            } else {
                var params = url.parse(request.url,true).query;   //取get传递的参数
            	route(handle,pathname,response,params);
            }
        })
    }

    var server = http.createServer(onRequest);

    server.listen(3000, '127.0.0.1');
    console.log('Server started on localhost port 3000');
}

module.exports.startServer = startServer;

#16 包管理器 NPM

  • 官网:https://www.npmjs.com/
  • 框架:express
  • 安装框架:npm install express
  • 安装单个包:npm install -g webpack
  • 安装很慢时:切换淘宝镜像
  • yarn:另一包管理器

#17 package.json 文件

  • dependencies,devDependencies:记录所有安装包的信息和版本
  • npm init
  • scripts > start:入口文件;npm run start
  • 已有packa.json,安装包:npm install

#18 nodemon

  • 监控所有的文件,文件一旦改变,服务器就会自动重启
  • 安装:npm install -g nodemon
  • 第一次运行:nodemon xxx or 在package.json > start:nodemon xxx
Node.js 与 Docker 深度整合:轻松部署与管理 Node.js 应用 通过本文的习,我们掌握了如何将 Node.js 应用与 Docker 深度整合,并成功部署到容器中。使用多阶段构建优化镜像大小,避免将不必要的文件和依赖打包进最终镜像。合理利用 Docker 缓存,将不常变化的操作(如安装依赖)放在 Dockerfile 的前面,以加速构建。保持容器的简洁性和高效性,只包含应用运行所需的文件,避免不必要的依赖。确保数据持久性,通过 Docker 卷来管理数据库或文件数据,避免容器删除时数据丢失。 阅读详情

相关推荐

前端必知:Node.js 基础入门指南

文章的主要目的是帮助前端开发者快速了解和掌握 Node.js基础知识。我们会涵盖 Node.js 的基本概念、核心原理、实际操作步骤,还会通过具体的代码案例让大家看到 Node.js 在实际项目中的应用。范围主要集中在 Node.js基础内容,不会涉及过于高深的高级特性。接下来,我们会按照以下几个部分来详细介绍 Node.js:首先是核心概念与联系,用有趣的故事和生活实例引出 Node.js,解释它的核心概念以及它们之间的关系;然后是核心算法原理和具体操作步骤,会用代码来详细说明;

AI架构全栈开发实战笔记 1538

服务器端渲染(SSR)与客户端渲染(CSR)在 Node.js 中的比较

服务器端渲染(SSR)是指在服务器上生成网站的完整 HTML 页面的过程。在用户请求页面时,服务器会快速生成 HTML 内容,然后直接将其返回给浏览器。这意味着在用户的浏览器中,页面在初次访问时就会被完整渲染。更快的首屏加载时间:由于返回的是完全渲染的 HTML,用户可以迅速看到页面内容。更好的 SEO:搜索引擎能够更容易抓取服务器渲染的内容,这对于需要 SEO 优化的网站尤为重要。更好的 用户体验:由于内容迅速显示,用户会有更好的使用体验,而不必等待 JavaScript 加载和执行。

有我更精彩的博客 1365

一、安装Node.js

Node.js 则不然,遇 I/O 操作时,它利用事件循环机制,先去处理其他任务,待 I/O 完成再回来接续,极大提升资源利用率与程序响应速度,让 JavaScript 得以在服务端施展拳脚,与 PHP、Python、Perl、Ruby 等老牌服务端语言一较高下。安装结束,需校验是否成功。打开命令提示符(cmd),输入 “node -v” 查看 Node.js 版本号,输入 “npm -v” 查看 npm(Node.js 的包管理器)版本号,若都能显示对应版本信息,表明安装无误,已为后续操作做好铺垫。

2401_83367969的博客 2541

Nodejs 第十一章(CSR SSR SEO)

在上一章的时候我们说过在node环境中无法操作DOM 和 BOM,但是如果非要操作DOM 和 BOM 也是可以的我们需要使用第三方库帮助我们jsdomjsdom是一个模拟浏览器环境的库,可以在 Node.js 中使用 DOM API。

qq1195566313的博客 2631

Nuxt.js实现SSR的应用

seo 即 搜索引擎优化(Search Engine Optimization),它是指通过站内优化,如:网站结构调整、网站内容建设、网站代码优化以及站外优化等方法,来进行搜索引擎优化。 简单说: 通过各种技术(手段)来确保,你的Web内容被搜素引擎最大化收录,最大化提高权重,带来更多流量。目前SEO;流量是变现的快车道,SEO 是低成本获取流量的最佳方法。 SPA 即 单页 Web...

大山博客 1万+

NodeJS习总结

较之前写的vue ECMAJavaScript,nodeJs其实是应该之前就写一写总结一下的。闲来无事就总结一下吧(北京的风真大!!!) 一、为什么要nodeJs? 其实我一开始很迷,我觉得我一个后端程序员应该不需要nodeJs ,但是你会发现2020年各大公司的Java招聘内卷都特别严重。越来越多的中小型公司趋近于全栈式的开发人员。所以NodeJs成为了很热门的(一直都很热门,但是笔者感觉更为严重了) 说一个题外话。其实NodeJs 本身习起来对前端后端都没有坏处。因为Node的主要作用是开发服

木兮兮 3043

一、Node.js 习前准备基本语法

数据类型:字符串、数字、布尔、数组、对象、Null、Undefined 字符串:var carname="Bill Gates"; 数字: var x1=34.00; 布尔: var x=true JavaScript 数组: var cars=new Array(); cars[0]="Audi"; cars[1]="BMW"; cars[2]="Volvo"; ...

学而不思则罔,思而不学则殆! 358

Node.js】使用 Node.js 需要了解多少 JavaScript?

总的来说,使用 Node.js 开发并不要求你掌握所有 JavaScript 的高级知识,但了解 JavaScript 的基础和异步编程的核心概念,将大大提高你的开发效率。通过不断习和实践,你将能够利用 Node.js 构建出高效、可扩展的应用程序。希望本文能帮助你了解在Node.js 之前需要掌握的 JavaScript 知识,帮助你在 Node.js 的开发路上走得更远。祝你编码愉快!

佚名程序员 1848

轻松Node.js系列

主要包括nodejs 基础知识web 服务器异步 同步 阻塞 非阻塞课程基础javascript 基础html 基础命令行基础Node.js 介绍Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效Node.js 的包管理器 npm,是全球最大的开源库生态系统javascript 是脚本语言,需要解析器才能执行,浏览器就充当了解析器。

m0_61703832的博客 212

Node.js和Vue

浅谈为什么vue前端项目要使用nodejs 一、传统的JavaScript 传统的js是运行在浏览器上的,因为浏览器内核分为两个部分: 渲染引擎---渲染HTML和CSS, JavaScript 引擎---负责运行 JavaScript,随着技术的发展, Chrome 使用的 JavaScript 引擎是 V8,它的速度非常快且性能好,同时由2009年5月Ryan Dahl开发的Node.js诞生。 二、什么是Node.js? Node.js 是一个基于 Chrome V8 引擎的 JavaS.

MRGCODING 1万+

Node.js环境下的JavaScript代码执行指南

Node.js是基于Chrome V8引擎的JavaScript运行环境,它使得JavaScript能够运行在服务器端。作为后端技术,Node.js提供了丰富的API,用于构建高性能、可伸缩的网络应用。Node.js以其事件驱动和非阻塞I/O模型在Web应用开发领域内得到了广泛的应用。Node.js的流行主要得益于其强大的生态系统和社区支持。其核心库由简单实用的模块组成,通过npm(Node Package Manager)可轻松扩展。

weixin_35794316的博客 1265

释放Node.js的潜力:NVM指南,让版本管理变得轻松

本文将深入介绍Node.js版本管理工具NVM(Node Version Manager),探讨其在Node.js开发中的重要性与实际应用。从基础到高级,我们将揭示NVM的奥秘,帮助读者更好地管理Node.js版本,提高开发效率

前端全栈大佬 6338

Node.js 入门核心基础知识笔记(新手详解版)

Node.js基础入门指南:从认知到实践》 摘要: 本文为Node.js新手提供系统化的习路径,重点解决三大核心问题:1)明确Node.js定位与应用场景,强调其在Web后端、工程化及自动化脚本领域的价值;2)详解Node.js核心特性,包括异步非阻塞IO模型和全栈JavaScript语言栈;3)规划高效习路径,从环境搭建、模块化开发到核心API实践。文章特别指出新手常见误区,如过早接触框架、路径处理错误等,并提供"最小可运行"的渐进式习方案,通过CommonJS模块、fs/p

SG_3604的博客 972

入门Node.js, 你应该阅读的书籍

说明 这里,没有哗众取宠,没错。通过阅读几本书籍,能把你带入门,就已经很不错了。 这个世上,从来没有哪本书能让你从入门到精通。因为精通只能通过在项目实战的不断积淀! 我以前是做前端开发的,在项目中,我负责前端网站的开发,同时,项目组配备了Java后台工程师。我们各做各的,相处得很好。突然一天,他提出离职。因为项目着急上线,来不及找到合适的人手。PM要接手他的后台Java代码,必须接,这...

悠悠 1万+

轻松 Node.js

一、事件NodeJs是基于事件驱动,拥有一个核心库:events,使用的时候需要引入:var events = require('events'); 1、util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。var util = require('util');1、util.inheritsutil.inherits(constru...

weixin_33961829的博客 99

轻松 Node.js - 基础 #2 全局对象

工具:IDE:vscode(超好用)GIF截图软件:gifcam番外工具前一 基础 #1 课程介绍与开发环境搭建 我们已经搭建好了Node.js环境了。这我们来讲Nodejs的全局对象。在浏览器中,有window对象。在控制台输入:console.log(window);在Nodejs,也有很多全局对象。首先,我们打开vscode,创建一个node01.js的文件。再呼出终端 ctrl+s...

柳鹏的博客 390

本人告诉你为什么 现在还要 Node.js

前言 前些日子刷知乎看到个 2019 年初的问题 2019年nodejs凉了吗?凉到什么程度了?才看到问题的时候吃了一惊,是不是我在的公司大量使用 Node.js 让我有了幸存者偏差,前端社区已经沧海桑田了么?读了大部分答案不禁有些感慨,写一下自己的理解 Node.js 从来不是为取代 Java 而生的 很多同在纠结每个公司必然使用 Java、有后端,而觉得 Node.js 到了穷途末路,这样的担忧大可不必,因为 Node.js 从来不是为了取代 Java 而生的,就像 Nginx 不是为了取代 Apac

haozige888的博客 1348
上一篇: Git
下一篇: Vue
贾学习
博客等级 码龄8年 7粉丝 24原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值