Еще один возможный (и определенно «не элегантный») подход к решению: проверить все стандартные пакеты Node.js с их именами функций (я подготовил список стандартных модулей для v0.10.35 из папки Node.js github /lib
согласно N recomendations on Core Modules).
К сожалению, Node.js не сохраняет информацию о загруженных базовых модулях в require.cache
, поэтому их невозможно обнаружить таким образом.
Функция testNative() обнаруживает почти все «нативные» функции, за исключением require() (и, возможно, некоторые другие функции, написанные на JavaScript и находящиеся за пределами модулей Node.js).
Комментарии:
- заполняют native_fns массив внутри функции testNative(). Если он медленный, вы можете извлечь эту часть вне функции.
- Функция использует eval() для обнаружения загруженных модулей, поэтому вам необходимо следовать правилу правильного именования.
Таким образом, функция тест работает только, если вы всегда использовать стандартные имена переменных для библиотеки переменных:
var fs = require('fs'); // good
var myfs = require('fs'); // bad
UPDATE: Эта уродливая часть может быть заменен анализом process.moduleList.
Код:
function testNative(fn) {
if(!!fn.toString().match(/{\s*\[native code\]\s*}/)) return true;
var std_modules = ['assert','buffer','child_process','cluster','console','constants',
'crypto','dgram','dns','domain','events','freelist','fs','http','https','module',
'net','os','path','punycode','querystring','readline','repl','smalloc','stream',
'string_decoder','sys','timers','tls','tracing','tty','url','util','vm','zlib',
'Math','JSON'];
var native_fns = [];
for(var i=0; i<std_modules.length;i++) {
try {
var module = eval(std_modules[i]);
native_fns.push(module);
if(module) {
for(var k in module) {
native_fns.push(module[k]);
}
}
} catch (err) {}
}
return native_fns.indexOf(fn) > -1;
}
// Test
function foo() {return 1};
var fs = require('fs');
console.log(testNative(fs.readFile)); // true
console.log(testNative(foo)); // false
console.log(testNative(JSON.stringify)); // true
Используя стандартные имена модулей всегда является слишком сильным предположением, чтобы я думаю – everconfusedGuy