我有一个文件content.js
,其中包含一些JavaScript代码,我想使用injectedJavaScript
将其注入WebView。
我试过:
fetch('./content.js').then((result) => {
result = result.text();
this.setState(previousState => (
{contentScript: result}
));
});
但它没有得到正确的文件。
const contentScript = require('./content.js');
这是可行的,但它会直接评估JavaScript,我似乎找不到一种方法在执行之前将其转换为字符串。
一个解决方案是将content.js
的代码复制到一个字符串中,但当我想编辑代码时,这会很烦人...
有人知道更好的解决方案吗?
这件事我已经找了将近一个星期了。:(
2条答案
按热度按时间oyt4ldly1#
由于expo使用的是webpack,因此您可以对其进行自定义。Webpack有一个loaders部分,你可能会感兴趣。您需要的加载器名为raw-loader。因此,当你需要一些文件时,webpack会根据它在config中的加载器链运行这个文件。默认情况下,所有
.js
文件都捆绑到index.js
中,当您运行应用程序时会执行index.js
。相反,您需要raw-loader
所需要的文件内容。它将插入类似于而不是:
因此,您需要:
在你的代码中:
qvtsj1bj2#
(2023年6月)@deathangel908的答案扩展
对于那些不想在每次导入给定文件时都指定加载器的用户,可以在
webpack.config.js
文件中使用模式匹配。我将想要注入的JS文件重命名为myscript.raw.js
-您的编辑器,eslint等仍然会将其视为常规的js文件,但您现在可以配置webpack以识别任何以.raw.js
结尾的文件名并使用原始加载器:(请确保使用
npm i --save-dev raw-loader
安装)你现在可以像导入其他JS文件一样导入文件,但它将被视为字符串:
如果直接使用字符串,您可能会在运行时收到一个奇怪的错误:
error while updating property injectedJavaScript
,为了抵消这个错误,只需将变量 Package 在字符串文字中:TypeScript用户须知
首先,你需要将你的
.raw.js
文件添加到你的typescriptexclude
块中,因为这些可注入的文件只能是纯JS,你不希望TypeScript抛出annyoing错误:其次,TypeScript会在导入时抛出错误:
Could not find a declaration file for module 'myscript'. '/path/to/myscript.raw.js' implicitly has an 'any' type
要解决这个问题,你必须在源代码中的某个地方创建一个声明(.d.ts
)文件,我刚刚在我的仓库的根目录中创建了一个名为declarations.d.ts
的文件: