将.js文件作为文本导入并在react-native expo中的WebView injectedJavaScript中使用

jdgnovmf  于 2023-06-30  发布在  React
关注(0)|答案(2)|浏览(90)

我有一个文件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的代码复制到一个字符串中,但当我想编辑代码时,这会很烦人...
有人知道更好的解决方案吗?
这件事我已经找了将近一个星期了。:(

oyt4ldly

oyt4ldly1#

由于expo使用的是webpack,因此您可以对其进行自定义。Webpack有一个loaders部分,你可能会感兴趣。您需要的加载器名为raw-loader。因此,当你需要一些文件时,webpack会根据它在config中的加载器链运行这个文件。默认情况下,所有.js文件都捆绑到index.js中,当您运行应用程序时会执行index.js。相反,您需要raw-loader所需要的文件内容。它将插入类似于

module.contentScript = function() { return "console.log('Hello world!')"}

而不是:

module.contentScript = function() { console.log('Hello World'}}

因此,您需要:

npm install raw-loader --save-dev

在你的代码中:

require('raw-loader!./content.js');
qvtsj1bj

qvtsj1bj2#

(2023年6月)@deathangel908的答案扩展

对于那些不想在每次导入给定文件时都指定加载器的用户,可以在webpack.config.js文件中使用模式匹配。我将想要注入的JS文件重命名为myscript.raw.js-您的编辑器,eslint等仍然会将其视为常规的js文件,但您现在可以配置webpack以识别任何以.raw.js结尾的文件名并使用原始加载器:

(请确保使用npm i --save-dev raw-loader安装)

// webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.raw.js$/i,
        use: "raw-loader",
      },
    ],
  },
}

你现在可以像导入其他JS文件一样导入文件,但它将被视为字符串:

// App.js

import myscript from "./myscript.raw.js" // myscript is just a string!

如果直接使用字符串,您可能会在运行时收到一个奇怪的错误:error while updating property injectedJavaScript,为了抵消这个错误,只需将变量 Package 在字符串文字中:

// App.js

<WebView
      // ...
      injectedJavaScript={`${myscript}`}
/>

TypeScript用户须知

首先,你需要将你的.raw.js文件添加到你的typescript exclude块中,因为这些可注入的文件只能是纯JS,你不希望TypeScript抛出annyoing错误:

// tsconfig.json

{
    // ...
    "exclude": [
        "node_modules",
        "babel.config.js",
        "metro.config.js",
        "*.raw.js"
    ]
    // ...
}

其次,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的文件:

// declarations.d.ts

declare module "*.raw.js" {
  const contents: string
  export default contents
}

相关问题