我是React的新手,我猜这里有些基本的东西我不太了解。默认的盖茨比页面如下所示。有没有办法像这样使用本地.js文件?
<script src="../script/script.js"></script>
我想实现的是让React忽略script.js
,但仍然让客户端使用它。默认的盖茨比页面如下所示,是否可以在该页面上做类似的事情?
import React from "react"
import { Link } from "gatsby"
import Layout from "../components/layout"
import Image from "../components/image"
import SEO from "../components/seo"
const IndexPage = () => (
<Layout>
<SEO title="Home" keywords={[`gatsby`, `application`, `react`]} />
<h1>Hi people</h1>
<p>Welcome to your new Gatsby site.</p>
<p>Now go build something great.</p>
<div style={{ maxWidth: `300px`, marginBottom: `1.45rem` }}>
<Image />
</div>
<Link to="/page-2/">Go to page 2</Link>
</Layout>
)
答案 0 :(得分:2)
有多种方法可以在GatsbyJS中添加脚本...
要在特定页面上执行脚本
创建您的script.js
文件并将其放置在/src
文件夹内的任何位置。
转到要在其中执行脚本的页面(例如/pages/myPage.js
),然后使用require()
在useEffect()
内部执行脚本,如下所示:
useEffect(() => {
// This runs the script
const myScript = require('../script.js')
}, [])
return <div />
要在客户端上运行它,可以检查window
文件中的script.js
对象:
if(typeof window !== 'undefined' && window.document) {
// Your script here...
}
如果要在每个组件/页面中全局执行脚本,则可以使用html.js
文件。
cp .cache/default-html.js src/html.js
html.js
文件中:<script dangerouslySetInnerHTML= {{ __html:` // your script here... `}} />
答案 1 :(得分:1)
如果您想使用Gatsby插件(对我而言,该插件与使用Helmet这样的外部库没有什么不同(插件毕竟是npm软件包)),则可以使用gatsby-plugin-load-script。
您可以提供src
属性的URL或本地路径。如果要将JS存储在本地文件中,例如some-minified-js.min.js
,请确保将其存储在项目根目录的static
目录中。
执行此操作后,就可以通过全局对象进行访问:
global.<object or func name here>
例如,我试图通过一个缩小的文件包含一个很小的JS库,因此我将文件存储在/static/my-minified-library.min.js
中,然后:
npm i --save gatsby-plugin-load-script
gatsby-config.js
plugins: [
{
resolve: "gatsby-plugin-load-script",
options: {
src: "/my-minified-library.min.js",
},
},
],
useEffect(() => {
const x = new global.MyImportedLibraryObject();
}, []}
答案 2 :(得分:0)
React适用于动态DOM。但是要通过浏览器呈现它,您的Web服务器应该发送一个静态索引页,其中React将作为另一个script
标签被包含。
因此,请查看您的index.html
页面,您可以在public
文件夹中找到该页面。例如,您可以在其中将script
标记插入标头部分。
答案 3 :(得分:0)
Gatsby在src文件夹中使用html.js。不是像大多数React项目那样的index.html。
示例html.js文件:
import React from "react"
import PropTypes from "prop-types"
export default class HTML extends React.Component {
render() {
return (
<html {...this.props.htmlAttributes}>
<head>
<meta charSet="utf-8" />
<meta httpEquiv="x-ua-compatible" content="ie=edge" />
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
{this.props.headComponents}
</head>
<body {...this.props.bodyAttributes}>
{this.props.preBodyComponents}
<div
key={`body`}
id="___gatsby"
dangerouslySetInnerHTML={{ __html: this.props.body }}
/>
{this.props.postBodyComponents}
</body>
</html>
)
}
}
HTML.propTypes = {
htmlAttributes: PropTypes.object,
headComponents: PropTypes.array,
bodyAttributes: PropTypes.object,
preBodyComponents: PropTypes.array,
body: PropTypes.string,
postBodyComponents: PropTypes.array,
}
要在dangerouslySetInnerHTML
内使用src/html.js
添加自定义Javascript:
<script
dangerouslySetInnerHTML={{
__html: `
var name = 'world';
console.log('Hello ' + name);
`,
}}
/>
您可以尝试在其中添加js,但是请注意,您的js可能无法正常工作。您可以随时查看react-helmet以获得更多动态应用程序,并将脚本添加到<head>
。
答案 4 :(得分:0)
经过数小时的挫折,我终于在GitHub上偶然发现discussion,为我解决了这个问题。在盖茨比,有一种叫做static folder的东西,一个用例是在捆绑的代码之外包括一个小的脚本。
其他处于相同情况的人,请尝试按以下步骤操作:
在项目的根目录创建一个static
文件夹。
将脚本script.js
放在文件夹static
中。
将脚本包含在具有react-helmet 的react dom中。
因此,对于我在原始问题中发布的代码,例如:
import React from "react"
import Helmet from "react-helmet"
import { withPrefix, Link } from "gatsby"
import Layout from "../components/layout"
import Image from "../components/image"
import SEO from "../components/seo"
const IndexPage = () => (
<Layout>
<Helmet>
<script src={withPrefix('script.js')} type="text/javascript" />
</Helmet>
<SEO title="Home" keywords={[`gatsby`, `application`, `react`]} />
<h1>Hi people</h1>
<p>Welcome to your new Gatsby site.</p>
<p>Now go build something great.</p>
<div style={{ maxWidth: `300px`, marginBottom: `1.45rem` }}>
<Image />
</div>
<Link to="/page-2/">Go to page 2</Link>
</Layout>
)
通知进口
import Helmet from "react-helmet"
import { withPrefix, Link } from "gatsby"
和脚本元素。
<Helmet>
<script src={withPrefix('script.js')} type="text/javascript" />
</Helmet>
这样可以节省我的时间,希望可以为其他人做。
答案 5 :(得分:0)
您可以使用Gatsby插件"gatsby-plugin-load-script."
轻松完成此操作只需执行以下操作:
static
的文件夹gatsby-config.js
{
resolve: 'gatsby-plugin-load-script',
options: {
src: '/test-script.js', // Change to the script filename
},
},
答案 6 :(得分:0)