我使用的是 Mac M1,刚刚升级到 Node 14.17.6LTS。
我尝试使用电子构建器(22.11.7)重建better_sqlite3(7.4.3),但出现以下错误:
“v8::ArrayBuffer”中没有名为“GetContents”的成员
有什么想法如何解决这个问题吗?提前致谢!
Run Code Online (Sandbox Code Playgroud)gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] SOLINK_MODULE(target) Release/.node CXX(target) Release/obj.target/fse/fsevents.o In file included from ../fsevents.cc:6: In file included from ../../nan/nan.h:2884: ../../nan/nan_typedarray_contents.h:34:43: error: no member named 'GetContents' in 'v8::ArrayBuffer' data = static_cast<char*>(buffer->GetContents().Data()) + byte_offset;
想知道具有V8引擎的node.js是否适合部署在有限的存储设备(例如256mb)上并与其他进程并行运行.
我读到它将连接机器的资源.有没有办法限制V8引擎本身的内存和处理使用?
首先 - 关于我的背景:我已经编程了一段时间(此时为10年),并且在编写想法时非常称职.我在一年多前开始从事网络应用程序编程工作,幸好发现了nodeJS,它使网络应用程序的创建感觉更像传统的编程.现在,我有一个node.js应用程序,我已经开发了一段时间,现在正在网络上生产.我的主要困惑源于这样一个事实,即我对Web开发世界很陌生,并且在监控我的应用程序时并不知道什么是重要的,什么是不重要的.
我正在使用Joyent SmartMachine,看看他们提供的分析选项有点压倒性.有很多不同的选项和配置,我不知道每个分析真正起作用的目的.对于下面的问题,我会感谢任何答案,无论是针对Joyent的云分析还是完全一般的.
现在,我主要关心的是弄清楚我的应用程序如何利用我运行的服务器.我想知道我的应用程序是否分配了适当数量的资源.它收到的请求数量是否会使服务器过度使用,还是需要额外的资源?为此目的,为NodeJS应用程序查看哪些分析非常重要?(如果有不同的话,在单独的服务器上使用MongoDB和Redis)
在管理正在生产的服务器时,还有哪些其他统计数据通常非常重要?我习惯于运行一次以执行特定操作的程序(例如,一旦计算出图像就完成运行的光线跟踪器),而不是连续运行并与许多客户端交互的web应用程序.我确信有很多事情对长期服务器管理员来说是显而易见的,而不是像我这样的新手.
在具体处理NodeJS时要注意什么?在处理NodeJS的单线程事件循环与更标准的服务器系统时,哪些统计/分析变得特别重要?
我还有其他关于数据库如何发挥作用的问题,但我认为这已经足够了...
我想知道是否有可能获得V8如何优化和内联的知识.
我创建了三个简单的测试函数,它们都以度为单位计算角度的正弦值.我将它们全部放入闭包中,以便V8能够内联局部变量.
1.使用预先计算的常数Math.PI / 180,然后执行Math.sin(x * constant).
我用过这段代码:
var test1 = (function() {
var constant = Math.PI / 180; // only calculate the constant once
return function(x) {
return Math.sin(x * constant);
};
})();
Run Code Online (Sandbox Code Playgroud)
2.动态计算常数.
var test2 = (function() {
var pi = Math.PI; // so that the compiler knows pi cannot change
// and it can inline it (Math.PI could change
// at any time, but pi cannot)
return function(x) {
return Math.sin(x …Run Code Online (Sandbox Code Playgroud) javascript之间的区别Array,Object并不是很大.实际上它似乎Array主要添加了length字段,因此您可以将Arrays和Objects用作数字数组:
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,在流行的JavaScript引擎(V8,JavaScriptCore,SpiderMonkey等)中,这是如何处理的?显然,我们不希望我们的数组实际存储为具有键值的哈希映射!我们怎样才能合理地确定我们的数据是否存储为实际数组?
据我所知,引擎可以采取一些方法:
Array实现方式与Object- 使用字符串键的关联数组完全相同.Array是一个特殊情况,一个std::vector支持数字键的类似数组,以及一些密度启发式,以防止疯狂的内存使用ar[100000000] = 0;Array是相同的Object,并且所有对象都获得启发式,以查看使用数组是否更有意义.如果有一个合适的阵列类型(咳嗽 WebGL类型阵列咳嗽),这真的会更简单.
我从来不知道use strict加速运行时间,但是一个简单的方法use strict是让我的基准测试速度更快,速度慢一点(速度慢一倍).这是怎么回事?
//
// RUN WITH AND WITHOUT THIS
//
"use strict";
var assert = require('assert');
var slice = [].slice;
function thunkify_fast(fn){
assert('function' == typeof fn, 'function required');
return function(){
var args = new Array(arguments.length);
for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
var ctx = this;
return function(done){
var called;
args.push(function(){
if (called) return;
called = true;
done.apply(null, arguments);
});
try {
fn.apply(ctx, args);
} catch (err) {
done(err); …Run Code Online (Sandbox Code Playgroud) 在节点命令行界面中运行时:
> Math.tan(Math.PI/2)
16331778728383844
Run Code Online (Sandbox Code Playgroud)
但在Chrome中:
> Math.tan(Math.PI/2)
Infinity
Run Code Online (Sandbox Code Playgroud)
是不是都使用相同的V8引擎?
节点的结果甚至不等于JavaScript中的最大"整数"值.
V8日期解析器坏了:
> new Date('asd qw 101')
Sat Jan 01 101 00:00:00 GMT+0100 (CET)
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用脆弱的正则表达式:
\d{1,2} (jan|feb|mar|may|jun|jul|aug|sep|oct|nov|dec) \d{1,4}
Run Code Online (Sandbox Code Playgroud)
但它太脆弱了.我不能依赖new Date (在V8中发布)并且也无法帮助我,因为时刻正在摆脱日期检测(github issue-thread).
是否有任何破解v8日期解析器的解决方法?
要清楚.我们有Gecko和V8都有Date.V8破坏了日期,Gecko已经工作了.我需要DateGecko中的from(Firefox).

更新:它肯定是破解了解析器https://code.google.com/p/v8/issues/detail?id=2602
不, Status: WorkingAsIntended
在Nodejs中,几乎没有阻塞I/O操作.这意味着几乎所有nodejs IO代码都涉及许多回调.这适用于对数据库,文件,进程等进行读写操作.典型示例如下:
var useFile = function(filename,callback){
posix.stat(filename).addCallback(function (stats) {
posix.open(filename, process.O_RDONLY, 0666).addCallback(function (fd) {
posix.read(fd, stats.size, 0).addCallback(function(contents){
callback(contents);
});
});
});
};
...
useFile("test.data",function(data){
// use data..
});
Run Code Online (Sandbox Code Playgroud)
我期待编写代码来进行许多 IO操作,所以我希望编写很多回调函数.我对使用回调很满意,但我担心所有的递归.我是否有可能遇到过多的递归并在某个地方吹过堆栈?如果我通过数千次回调对我的键值存储进行数千次单独写入,我的程序最终会崩溃吗?
我误解或低估了影响吗?如果没有,有没有办法解决这个问题,同时仍然使用Nodejs的回调编码风格?
V8需要声明HandleScope才能清除在作用域内创建的任何Local句柄.我知道HandleScope将取消引用这些句柄进行垃圾收集,但我很感兴趣为什么每个Local类都不会像大多数内部ref_ptr类型的助手那样自行解除引用.
我的想法是,HandleScope可以通过一次性转储大量句柄而不是像在ref_ptr类型作用域类中那样逐个转储来更有效地完成它.
v8 ×10
node.js ×6
javascript ×5
optimization ×2
analytics ×1
arrays ×1
callback ×1
date ×1
datetime ×1
electron ×1
infinity ×1
inline ×1
joyent ×1
math ×1
monitoring ×1
performance ×1
recursion ×1
spidermonkey ×1
strict ×1