深入出不来nodejs源码-编译启动(1)
整整弄了两天,踩了无数的坑,各种奇怪的error,最后终于编译成功了。
网上的教程基本上都过时了,或者是版本不对,都会报一些奇怪的错误,这里总结一下目前可行的流程。
node版本:v10.1.0。
首先需要一些准备工作:
1、Visual Studio 2017 传送门:https://www.visualstudio.com/zh-hans/downloads/
2、python2.7 传送门:https://www.python.org/downloads/release/python-2715/
3、NASM 传送门:https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win64/
4、Git bash 传送门:https://git-scm.com/downloads
全部安装完,然后记得给python与NASM添加环境变量。
接下来就是把node的源码给down下来,传送门:https://nodejs.org/en/download/current/
这个LTS还是current自己选,反正点那个下载源码的按钮:

把东西弄下来解压到一个地方,然后双击文件夹里面的vcbuild.bat:

可以在这个批处理文件打个断点,可以发现输出信息如下:

脚本的开始都是在检测是否有预装对应的工具,然后调用其余的批处理文件进行编译。
这个时间会比较长,可以先去吃个饭。你会发现文件夹在逐渐变大,最后大概有个20G……
编译完成后,文件夹会有一个node.sln,在VS2017中选择文件-打开-项目/解决方案,双击这个文件,会把node项目给引到IDE中去。
这时如果直接点击开始调试,可能会出现以下问题:

这是因为项目的默认启动项设成了目录的第一个,右键解决方案,点击设置自动项目:

选择单启动项目,把那个cares改成node:

这样就可以开始启动node项目,时间非常的长……
这时候再次点击开始调试,可能又会出现以下错误:

这个弹窗其实是个幌子,真正的错误是控制台报错,这个Debug是一个类似于webpack打包的环境变量,有Debug和Release两种,设置地点在IDE的菜单下面:

而这个文件确实找不到,但是我在Release里面发现了node.exe与那个失踪的openssl.def。
解决办法就是把Release文件夹里的复制到Debug文件夹中去,然后再次尝试应该就成了,当然,如果把环境变量换成Release也是OK的。
再再次点击开始调试,又是一段非常长的时间,最后成功的话,理论上是会弹出一个node的REPL窗口,就是平时在cmd里面输入node指令的样子,如下:

检测一下是否读取的是本地的代码,打开node_main.cc,添加一个log代码:

这次不点调试,太久了,点那个开始执行(不调试),可以到输出如下:

至此,已经可以对nodejs的源码打log了,源码之路的基石已经铺好。
不知道有没有类似于热重载的功能,这C++启动一次实在是太久了。
深入出不来nodejs源码-编译启动(1)的更多相关文章
- 深入出不来nodejs源码-V8引擎初探
原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...
- 深入出不来nodejs源码-timer模块(JS篇)
鸽了好久,最近沉迷游戏,继续写点什么吧,也不知道有没有人看. 其实这个node的源码也不知道该怎么写了,很多模块涉及的东西比较深,JS和C++两头看,中间被工作耽搁回来就一脸懵逼了,所以还是挑一些简单 ...
- 深入出不来nodejs源码-从fs.stat方法来看node架构
node的源码分析还挺多的,不过像我这样愣头完全平铺源码做解析的貌似还没有,所以开个先例,从一个API来了解node的调用链. 首先上一张整体的图,网上翻到的,自己懒得画: 这里的层次结构十分的清晰, ...
- 深入出不来nodejs源码-events模块
这一节内容超级简单,纯JS,就当给自己放个假了,V8引擎和node的C++代码看得有点脑阔疼. 学过DOM的应该都知道一个API,叫addeventlistener,即事件绑定.这个东西贯穿了整个JS ...
- 深入出不来nodejs源码-内置模块引入再探
我发现每次细看源码都能发现我之前写的一些东西是错误的,去改掉吧,又很不协调,不改吧,看着又脑阔疼…… 所以,这一节再探,是对之前一些说法的纠正,另外再缝缝补补一些新的内容. 错误在哪呢?在之前的初探中 ...
- 深入出不来nodejs源码-内置模块引入初探
重新审视了一下上一篇的内容,配合源码发现有些地方说的不太对,或者不太严谨. 主要是关于内置模块引入的问题,当时我是这样描述的: 需要关注的只要那个RegisterBuiltinModules方法,从名 ...
- 深入出不来nodejs源码-timer模块(C++篇)
终于可以填上坑了. 简单回顾一下之前JS篇内容,每一次setTimeout的调用,会在一个对象中添加一个键值对,键为延迟时间,值为一个链表,将所有该时间对应的事件串起来,图如下: 而每一个延迟键值对的 ...
- 深入出不来nodejs源码-流程总览
花了差不多两周时间过了下primer C++5th,完成了<C++从入门到精通>.(手动滑稽) 这两天看了下node源码的一些入口方法,其实还是比较懵逼的,语法倒不是难点,主要是大量的宏造 ...
- 浅析libuv源码-编译启动
面试的间隙回头复习了一下node,感觉node就像一个胶带,把V8和libuv粘在了一起. V8毫无疑问,负责解析执行JavaScript,相当于语言层面的桥梁:而libuv则是负责操作系统底层功能的 ...
随机推荐
- 一键安装Android开发环境
一键安装Android开发环境 1 下载tadp-3.0r4-linux-x64.run 进入下面的地址下载: https://developer.nvidia.com/gameworksdownlo ...
- 如何在shell脚本中判断文件或者文件夹是否存在?
1:查找文件夹 如果文件夹存在,则打印一句存在,否则打印不存在 这里的话可以自由加一些指令. if [ test -d 文件夹名称 ] ; then echo "文件夹存在!" e ...
- ZooKeeper客户端事件串行化处理
为了提升系统的性能,进一步提高系统的吞吐能力,最近公司很多系统都在进行异步化改造.在异步化改造的过程中,肯定会比以前碰到更多的多线程问题,上周就碰到ZooKeeper客户端异步化过程中的一个死锁问题, ...
- 图片像素对比OpenCV实现,实现人工分割跟算法分割图像结果的对比
图片对比,计算不同像素个数,已经比率.实现人工分割跟算法分割图像结果的对比,但是只能用灰度图像作为输入 // imageMaskComparison.cpp : 定义控制台应用程序的入口点. // / ...
- 瑞芯微RK3188摄像头相关参数的配置
- 回顾一下shell脚本1
首先: 1.编写一个hello.sh的程序 hello.sh vim hello.sh #!/bin/sh #作者:yangyx echo "hello shell"</sp ...
- javascript内置对象速查(二)
Window对象 每个浏览器窗口或框架都对应于一个Window对象,它是随body或frameset元素的每个实例一起创建的对象. function status_text(){ window.sta ...
- 恶补web之八:jQuery(3)
jquery和其他js框架.jQuery使用$作为jQuery的简写,但是还有很多js框架,比如: MooTools,Backbone,Sammy,Cappuccino,Knockout,JavaSc ...
- nodejs实现最简单的爬虫
本文将以抓取百度搜索结果中关键词的相关搜索为例子,教会大家以nodejs制作最简单的爬虫: 开始之前呢,先来个公众号求粉: 将使用的node模块及属性介绍: request: ...
- 到底创建了几个String对象?
到底创建了几个String对象? 标签: 堆栈使用 对象创建 分类: 开发技术 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址:http://zan ...