Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

require这类要加载第三方的函数要这么做 #3

Open
fangkyi03 opened this issue May 14, 2020 · 16 comments
Open

require这类要加载第三方的函数要这么做 #3

fangkyi03 opened this issue May 14, 2020 · 16 comments

Comments

@fangkyi03
Copy link

本地js种使用到了require 自己本地通过setProperty的方式 的确让require在执行的时候 回调了回来
但是自己接管了require以后 就等于自身默认不在支持require语法

 var jsAlertFunction =
        JSObject.makeFunctionWithCallback(_jsContext, 'require', Pointer.fromFunction(require));
    _jsContext.globalObject.setProperty('require', jsAlertFunction.toValue(),
        JSPropertyAttributes.kJSPropertyAttributeNone);

比如这种语法
image

就会提示报错

我现在的问题 就是 如何能让jscore自身就支持require语法 并且可以自己去找指定文件读取

@xuelongqy
Copy link
Owner

xuelongqy commented May 15, 2020

目前是不支持的。不过有两种方案:1.使用打包工具,将代码打包成一个js文件; 2.绑定native方法,注册require类似的功能

@fangkyi03
Copy link
Author

注册require功能就是我上面写的 我实现了 大部分代码都能跑 但是有些恶心的代码 我真没办法了 跑不动

比如像这种
image

_core.js本身不返回Object.getOwnPropertySymbols;
全角上面那个执行完以后才有这个值 但是坑就坑在这里

image
这就是core.js的内容

基本上现在所有的报错 都是跟babel-runtime有关系的

@xuelongqy
Copy link
Owner

这只是一个引擎,实现不了。你只有使用打包工具,将所有的文件打包为一个js。

@xioxin
Copy link

xioxin commented May 16, 2020

@fangkyi03
require('./_core') 只是一个单例对象,其他方法都是动态添加的。
是在引入其他相关功能文件时候,方法会写入到require('./_core')

你可以查看下 core-js的相关实现代码。比如assign方法
https://github.com/zloirock/core-js/blob/v2/library/modules/es6.object.assign.js

https://github.com/zloirock/core-js/blob/v2/library/modules/_export.js

如果你需要实现 require只需要同一个文件只初始化一次,之后其他地方require的时候直接返回上次的对象即可。

可以参考
https://javascript.ruanyifeng.com/nodejs/module.html#%E6%A8%A1%E5%9D%97%E7%9A%84%E7%BC%93%E5%AD%98

或者利用 webpack 打包成一个文件

@fangkyi03
Copy link
Author

打包成一个文件体积太大 而且存在重复打包的问题 这样等于 我原有的页面是 pages + npm两个文件的 现在全部打成一个 这个包的体积 还不翻天了

@fangkyi03
Copy link
Author

有没有谁在ios 里面写过这种项目的 不然的话 别人都是这么用require这种的

@fangkyi03
Copy link
Author

出钱有人能解决吗 我想要一个完整的js运行环境 支持所es7以下语法

@xioxin
Copy link

xioxin commented May 19, 2020

有没有谁在ios 里面写过这种项目的 不然的话 别人都是这么用require这种的

ios下有 jsbox 不过不是开源项目。
require方法本身实现并不复杂。我上面也给了实现思路。别人肯定也是自己写的。
不过实现之后你会发现还有大量的方法等着你去实现。http请求啊,fs文件系统啊。工作量是非常大的

js引擎只提供基本语法和运算。其他接口的都需要自己实现。
nodejs中,require方法是node.js的一部分,不是v8的一部分。

我不清楚你具体是要实现什么,不过目前觉得可能这条路会很困难。

@xuelongqy
Copy link
Owner

这只是一个引擎。我不清楚为何你执着需要require,我觉得完全可以用打包的方式避开。如果你需要完整的环境,可以参考我的另一个项目flutter_node,不过需要在多线程或者隔离中使用,因为事件循环是独立的。另一种方案,我觉得可以参考一下腾讯的mxFlutter

@fangkyi03
Copy link
Author

因为我想直接执行原有web打包出来的东西 就跟rn一样 然后去解析里面返回的值 解析dom去生成 而mxflutter的那个我看了 他那个是简单的实现 而且也不用考虑js的一些语法糖带来的兼容性问题 他的require就是找到一个路径以后 然后遍历整个文件夹然后找到对应的文件去执行 他那个是可以的 因为它不需要兼容像babel-runtime那种东西 我呢 是想 直接可以跑原有代码 在上层做一次解析 让其还原成原生组件 flutter-node我看了 我还留言了 我不知道你那个是否可以直接支持require 其次这么传参 这么注入并能跟flutter互动 我也不清楚

@xuelongqy
Copy link
Owner

require是一个糟糕的设计。原生本身是不支持的,是node的语法,所以并非是兼容性的问题。支持难度较大,建议放弃

@fangkyi03
Copy link
Author

如果不需要兼容babel-runtime之类的话 我自己目前写的require就是可以的 实现方式跟mxflutter一样 但是一遇到那种坑的语法以后 就没辙了 太多需要兼容的东西了

@fangkyi03
Copy link
Author

rn的那套东西 可以用吗 如果把他那套东西迁移过来的话

@xioxin
Copy link

xioxin commented May 19, 2020

可以参考我的另一个项目flutter_node

😯还有这样的项目,今晚试试。不过内嵌一个v8 ios能上架吗?

@fangkyi03
Copy link
Author

flutter-node我跑了 一点就崩溃了

@fangkyi03
Copy link
Author

flutter1.17版本的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants