编译使用脚本js2c.py ,编译JS文件生存node_javascript.cc命令如下
js2c.py源码分析:
def main():
//将目标文件赋值给natives .sys.argv[0]是自身的文件名
natives = sys.argv[1]
//将所有要编译的JS文件加入到source_files列表中去
source_files = sys.argv[2:]
//下面这条if语句实际上变没有执行,不用理会
if source_files[-2] == ‘-t’:
global TEMPLATE
TEMPLATE = source_files[-1]
source_files = source_files[:-2]
//核心函数,将所有JS文件转换成数组,一一对应
JS2C(source_files, [natives])
def JS2C(source, target):
modules = []
consts = {}
macros = {}
macro_lines = []
for s in source:
//按照路径符对字符串解析,以macros.py结尾的文件读取存在列表中
if (os.path.split(str(s))[1]).endswith(‘macros.py’):
macro_lines.extend(ReadLines(str(s)))
else:
//将所有JS文件加到列表中
modules.append(s)
Process input from all *macro.py files
Build source code lines
definitions = []
initializers = []
hash_initializers = [];
for name in modules:
//读取单个JS文件
lines = ReadFile(str(name))
//使用consts进行转换,由于consts为空,所以下面这句话基本没用
lines = ExpandConstants(lines, consts)
//使用macros进行转换,这段转换函数没仔细研读。直接看转换结果,发现其作用就是检测发现上面所列的name字段,然后将这个字段(一般是函数调用)置空
lines = ExpandMacros(lines, macros)
//这是转化前后的对比
deprecated_deps = None
//
# On Windows, “./foo.bar” in the .gyp file is passed as “foo.bar”
# so don’t assume there is always a slash in the file path.
if ‘/’ in name or ‘\’ in name:
split = re.split(’/|\\’, name)
if split[0] == ‘deps’:
if split[1] == ‘node-inspect’ or split[1] == ‘v8’:
deprecated_deps = split[1:]
split = [‘internal’] + split
else:
split = split[1:]
name = ‘/’.join(split)
//需要被转化的js文件路径,要不以lib开头要不以deps开头,上面这个正则的意思就是如果以lib开头就去掉lib,如果以deps开头
则在最前面加上internal.其它的则不变如下图//
//
# if its a gypi file we’re going to want it as json
# later on anyway, so get it out of the way now
if name.endswith(".gypi"):
lines = re.sub(r’#.*?\n’, ‘’, lines)
lines = re.sub(r’’’, ‘"’, lines)
name = name.split(’.’, 1)[0]
var = name.replace(’-’, ‘’).replace(’/’, '’)
key = ‘%s_key’ % var
value = ‘%s_value’ % var
//使用sha256算法计算x的散列并返回十六进制的值
hash_value = hashlib.sha256(lines).hexdigest()
//
definitions.append(Render(key, name))
definitions.append(Render(value, lines))
initializers.append(INITIALIZER.format(key=key, value=value))
hash_initializers.append(HASH_INITIALIZER.format(key=name, value=hash_value))
//
if deprecated_deps is not None:
name = ‘/’.join(deprecated_deps)
name = name.split(’.’, 1)[0]
var = name.replace(’-’, ‘’).replace(’/’, '’)
key = ‘%s_key’ % var
value = ‘%s_value’ % var
//
definitions.append(Render(key, name))
definitions.append(Render(value, DEPRECATED_DEPS.format(module=name)))
initializers.append(INITIALIZER.format(key=key, value=value))
hash_initializers.append(HASH_INITIALIZER.format(key=name, value=hash_value))
xx# Emit result
output //就是node_javascript.cc文件啦
output = open(str(target[0]), “w”)
//将所有JS生成的16进制数据format填充进去,然后写入到输出文件
output.write(TEMPLATE.format(definitions=’’.join(definitions),
initializers=’’.join(initializers),
hash_initializers=’’.join(hash_initializers)))
output.close()
到这里为止,就把所有的JS文件转化到node_javascript.cc里面,然后就是编译C++源码了
使用py生成node_javascript.cc 下面显示的数据实际在都是在同一行,没有换行.为了方面显示观看进行了换行处理.其中JS文件与文件之间是用空格隔开的.
python tools/js2c.py
“$(obj)/gen/node_javascript.cc”
lib/internal/per_context.js
lib/internal/bootstrap/cache.js
lib/internal/bootstrap/loaders.js
lib/internal/bootstrap/node.js
lib/async_hooks.js
lib/assert.js
lib/buffer.js
lib/child_process.js
lib/console.js
lib/constants.js
lib/crypto.js
lib/cluster.js
lib/dgram.js
lib/dns.js
lib/domain.js
lib/events.js
lib/fs.js
lib/http.js
lib/http2.js
lib/_http_agent.js
lib/_http_client.js
lib/_http_common.js
lib/_http_incoming.js
lib/_http_outgoing.js
lib/_http_server.js
lib/https.js
lib/inspector.js
lib/module.js
lib/net.js
lib/os.js
lib/path.js
lib/perf_hooks.js
lib/process.js
lib/punycode.js
lib/querystring.js
lib/readline.js
lib/repl.js
lib/stream.js
lib/_stream_readable.js
lib/_stream_writable.js
lib/_stream_duplex.js
lib/_stream_transform.js
lib/_stream_passthrough.js
lib/_stream_wrap.js
lib/string_decoder.js
lib/sys.js
lib/timers.js
lib/tls.js
lib/_tls_common.js
lib/_tls_wrap.js
lib/trace_events.js
lib/tty.js
lib/url.js
lib/util.js
lib/v8.js
lib/vm.js
lib/worker_threads.js
lib/zlib.js
lib/internal/assert.js
lib/internal/async_hooks.js
lib/internal/bash_completion.js
lib/internal/buffer.js
lib/internal/cli_table.js
lib/internal/child_process.js
lib/internal/cluster/child.js
lib/internal/cluster/master.js
lib/internal/cluster/round_robin_handle.js
lib/internal/cluster/shared_handle.js
lib/internal/cluster/utils.js
lib/internal/cluster/worker.js
lib/internal/crypto/certificate.js
lib/internal/crypto/cipher.js
lib/internal/crypto/diffiehellman.js
lib/internal/crypto/hash.js
lib/internal/crypto/keygen.js
lib/internal/crypto/pbkdf2.js
lib/internal/crypto/random.js
lib/internal/crypto/scrypt.js
lib/internal/crypto/sig.js
lib/internal/crypto/util.js
lib/internal/constants.js
lib/internal/dgram.js
lib/internal/dns/promises.js
lib/internal/dns/utils.js
lib/internal/domexception.js
lib/internal/encoding.js
lib/internal/errors.js
lib/internal/error-serdes.js
lib/internal/fixed_queue.js
lib/internal/freelist.js
lib/internal/fs/promises.js
lib/internal/fs/read_file_context.js
lib/internal/fs/streams.js
lib/internal/fs/sync_write_stream.js
lib/internal/fs/utils.js
lib/internal/fs/watchers.js
lib/internal/http.js
lib/internal/inspector_async_hook.js
lib/internal/linkedlist.js
lib/internal/modules/cjs/helpers.js
lib/internal/modules/cjs/loader.js
lib/internal/modules/esm/loader.js
lib/internal/modules/esm/create_dynamic_module.js
lib/internal/modules/esm/default_resolve.js
lib/internal/modules/esm/module_job.js
lib/internal/modules/esm/module_map.js
lib/internal/modules/esm/translators.js
lib/internal/safe_globals.js
lib/internal/net.js
lib/internal/options.js
lib/internal/print_help.js
lib/internal/process/esm_loader.js
lib/internal/process/main_thread_only.js
lib/internal/process/next_tick.js
lib/internal/process/per_thread.js
lib/internal/process/promises.js
lib/internal/process/stdio.js
lib/internal/process/warning.js
lib/internal/process/worker_thread_only.js
lib/internal/querystring.js
lib/internal/process/write-coverage.js
lib/internal/process/coverage.js
lib/internal/readline.js
lib/internal/repl.js
lib/internal/repl/await.js
lib/internal/repl/recoverable.js
lib/internal/socket_list.js
lib/internal/test/binding.js
lib/internal/test/heap.js
lib/internal/timers.js
lib/internal/tls.js
lib/internal/trace_events_async_hooks.js
lib/internal/tty.js
lib/internal/url.js
lib/internal/util.js
lib/internal/util/comparisons.js
lib/internal/util/inspect.js
lib/internal/util/inspector.js
lib/internal/util/types.js
lib/internal/http2/core.js
lib/internal/http2/compat.js
lib/internal/http2/util.js
lib/internal/v8_prof_polyfill.js
lib/internal/v8_prof_processor.js
lib/internal/validators.js
lib/internal/stream_base_commons.js
lib/internal/vm/source_text_module.js
lib/internal/worker.js
lib/internal/streams/lazy_transform.js
lib/internal/streams/async_iterator.js
lib/internal/streams/buffer_list.js
lib/internal/streams/duplexpair.js
lib/internal/streams/legacy.js
lib/internal/streams/destroy.js
lib/internal/streams/state.js
lib/internal/streams/pipeline.js
lib/internal/streams/end-of-stream.js
lib/internal/wrap_js_stream.js
deps/v8/tools/splaytree.js
deps/v8/tools/codemap.js
deps/v8/tools/consarray.js
deps/v8/tools/csvparser.js
deps/v8/tools/profile.js
deps/v8/tools/profile_view.js
deps/v8/tools/logreader.js
deps/v8/tools/arguments.js
deps/v8/tools/tickprocessor.js
deps/v8/tools/SourceMap.js
deps/v8/tools/tickprocessor-driver.js
deps/node-inspect/lib/_inspect.js
deps/node-inspect/lib/internal/inspect_client.js
deps/node-inspect/lib/internal/inspect_repl.js
deps/acorn/dist/acorn.js
deps/acorn/dist/walk.js
config.gypi
tools/check_macros.py
src/notrace_macros.py
src/noperfctr_macros.py
tools/nodcheck_macros.py
编译使用脚本js2c.py ,编译JS文件生存node_javascript.cc命令如下相关推荐
- python eel 安卓_测试Eel——进行py与js文件数据传输
前言 放假在家无聊,翻开吃灰的收藏夹 收藏了这么久的的吗(=・ω・=) 看着这些尘封已久的宝典,自责不已,下定决心要好好学习一番(误)!编程新手,兴趣使然,纯属分享学习经历!有错误欢迎大佬指正. 准备 ...
- 关于uview-ui框架在uni-app(v3编译模式,app)中,http.interceptor.js文件中无法用的getApp({allowDefault: true})获取globalData
// 此为自定义配置参数,具体参数见上方说明Vue.prototype.$u.http.setConfig({baseUrl: getApp({allowDefault: true}).globalD ...
- 网络安全-网站后台的寻找+网页JS文件信息收集
网络安全-网站后台的寻找+网页JS文件信息收集 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 五,学习网络安全知识请勿适用于违法行为 ...
- VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法
VSCode中,新建js文件中编译器自带jQuery提示失效的解决方法 在VSCode中,新建js文件可能会发生VSCode自带的jQuery提示引起失效,如下图 在HTML文件中进行编辑,<s ...
- uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)
一.指令压缩 1.安装node,npm--详细见nodejs安装与使用入门 2.安装 uglifyjs--npm install -g uglify-js 3.压缩例子:1)uglifyjs mai ...
- Vue中ESlint配置文件eslintrc.js文件详解
最近在跟着视频敲项目时,代码提示出现很多奇奇怪怪的错误提示,百度了一下是eslintrc.js文件没有配置相关命令,ESlint的语法检测真的令人抓狂,现在总结一下这些命令的解释,方便以后查阅. 默认 ...
- python程序编译之后、找不到生成的pyc文件_为什么主要的可运行的Python脚本没有被编译为pyc文件,如模块?...
当模块加载时,py文件被"字节编译"为pyc文件.时间戳记记录在pyc文件中. 这样做不会使其运行速度更快,但加载速度更快. 因此,当您加载它们时,"字节编译" ...
- VScode中html怎么引入js,vscode中如何使用typescript,如何自动编译成js文件
使用vscode创建一个typescript程序 1:介绍 typescript是一个跨平台的编程语言,专门用于前端的语言,是由微软开发,在2013年6月正式发布,它是javascript的超集,扩展 ...
- gulp-babel 阻止了js文件编译的进程?
现象 : 编译打包的js没有输出到目标文件夹里,只是单单的生成了一个目标目录,目录里没有文件 解决方法:gulp-babel ^8.0.0 使用了 ^7.0.1的 依赖插件.统一gulp-babe ...
最新文章
- 利用SparkSQL(java版)将离线数据或实时流数据写入hive的用法及坑点
- ejb 2.0 3.0_定义EJB 3.1视图(本地,远程,无接口)
- TK8亮度蒙版PS插件:TKactions V8 for Mac 兼容ps2021
- 解决 git pull/push 每次都要输入用户名密码的问题
- underscore api
- 全面提升AI语言理解能力,达摩院自研语言模型体系登顶6大权威榜单
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
- 3分钟了解计算机基础知识,你对电脑还一无所知?3分钟带你全面了解电脑基础知识...
- TextView的属性
- Django book 2.0
- 【项目管理案例】第九期:如何做好项目整合管理
- 七大人脉宝典造亿万富翁
- VML标记与通用属性
- 基于大数据的精准营销与应用场景
- 2014年总结和2015年计划
- python的re模块替换文件字符串_Python 正则处理_re模块
- 【已注册】充QQ业务软件
- [扩展阅读] EasyGUI 学习文档【超详细中文版】
- 如何清除掉“无法删除”的顽固文件
- Vulkan_SSAO—屏幕空间环境光遮蔽