【问题标题】:Adding External JS file to React JS Project将外部 JS 文件添加到 React JS 项目
【发布时间】:2020-02-25 06:09:24
【问题描述】:

我已经经历了很多答案,但仍然无法做到

当 js 包含在公用文件夹中时,这可以正常工作,但是当路由更改时,这不起作用

<script src="%PUBLIC_URL%/JS/jQuery-2.1.4.min.js"></script>
<script src="%PUBLIC_URL%/BOOTSTRAP-JS/bootstrap.min.js"></script>
<script src="%PUBLIC_URL%/JS/app.min.js"></script>

我将此代码包含在我的头文件中以添加外部 js 文件并正常工作,但每次页面更改脚本都会添加。我在 loadScript 函数中遗漏了一些东西。

export default class Header extends Component {
    componentDidMount() {
        var loadScript = function (src) {
            var tag = document.createElement('script');
            tag.type = "text/javascript";
            tag.async = false;
            tag.src = src;
            var body = document.getElementsByTagName('body')[0];
            body.appendChild(tag);
        }
        loadScript("/JS/jQuery-2.1.4.min.js");
        loadScript("/BOOTSTRAP-JS/bootstrap.min.js");
        loadScript("/JS/app.min.js");
    }

    render() {
        return (
            <header className="main-header">
                <a href="#" className="logo">
                    <span className="logo-mini"><img src={ImageSmall} /></span>
                    <span className="logo-lg">
                        <img src={RelconImage} style={{ width: '170px', height: 60 }} />
                    </span>
                </a>
                <nav className="navbar navbar-static-top" role="navigation">
                    <img src={menuIcon} className="sidebar-toggle" data-toggle="offcanvas" role="button" style={{ width: '55px' }} />
                    <label style={{ color: 'white', paddingTop: '18px' }} />
                    <div className="navbar-custom-menu">
                        <ul className="nav navbar-nav">
                            <li className="dropdown user user-menu">
                                <a href="#" className="dropdown-toggle" data-toggle="dropdown"> <img src={userIcon} className="user-image" alt="User Image" />
                                    <span className="hidden-xs" />
                                </a>
                                <ul className="dropdown-menu">
                                    <li className="user-header"><img src={userIcon} className="img-circle" alt="User Image" />
                                        <p>Relcon</p></li>
                                    <li className="user-footer">
                                        <div className="pull-right">
                                            <a className="btn btn-info">SIGN OUT</a>
                                        </div>
                                    </li>
                                </ul>
                            </li>
                            <li><a href="#" data-toggle="control-sidebar"><img src={VendorLogo} style={{ width: '200px', height: '50px', marginTop: '-10px' }} /></a></li>
                        </ul>
                    </div>
                </nav>
            </header>
        );
    }
}

为了停止追加,我使用了以下代码,但是当菜单更改时这不起作用

componentDidMount() {
    var loadScript = function (src, file_id) {
        var scriptexist = document.getElementById(file_id);
        if (!scriptexist) {
            var tag = document.createElement('script');
            tag.type = "text/javascript";
            tag.async = false;
            tag.src = src;
            tag.id = file_id;
            var body = document.getElementsByTagName('body')[0];
            body.appendChild(tag);
        }
    }
    loadScript("/JS/jQuery-2.1.4.min.js", 'jqjs');
    loadScript("/BOOTSTRAP-JS/bootstrap.min.js", 'bootsjs');
    loadScript("/JS/app.min.js", 'appjs');
}

这就是每次页面更改时它都附加到正文的方式

<script type="text/javascript" src="/JS/jQuery-2.1.4.min.js"></script>
<script type="text/javascript" src="/BOOTSTRAP-JS/bootstrap.min.js"></script>
<script type="text/javascript" src="/JS/app.min.js"></script>
<script type="text/javascript" src="/JS/jQuery-2.1.4.min.js"></script>
<script type="text/javascript" src="/BOOTSTRAP-JS/bootstrap.min.js"></script>
<script type="text/javascript" src="/JS/app.min.js"></script>
这些是我的其他子页面,而 ComponentWillMountFunction 在 Header 页面中。

class dashboard extends Component {
    render() {
        return (
            <div>
                <Header />
                <Sidebar />
                <div className="content-wrapper">
                    <section className="content-header" />
                    <section className="content">
                        {/* Page Content Here */}
                    </section>
                </div>
                <Footer />
            </div>
        );
    }
}
export { dashboard }

class transactions extends React.Component {
    render() {
        return (
            <div>
                <Header />
                <Sidebar />
                <div className="content-wrapper">
                    <section className="content-header" />
                    <section className="content">
                      This are transactions
                    </section>
                </div>
                <Footer />
            </div>
        );
    }
}
export { transactions }

这是我的应用文件

import React from 'react';
import { history } from '../helpers';
import { login } from '../login';
import { dashboard } from '../dashboard';
import { transactions, inventorys } from '../reports';
import { Router, Route, Switch, Redirect } from 'react-router-dom';
class App extends React.Component {
  render() {
    return (
      <Router history={history}>
        <Switch>
          <Route exact path="/" component={login} />
          <Route path="/dashboard" component={dashboard} />
          <Route path="/transaction" component={transactions} />
          <Route path="/inventory" component={inventorys} />
          <Redirect from="*" to="/" />
        </Switch>
      </Router>
    );
  }
}

export { App };

【问题讨论】:

  • 告诉我,问题到底是什么?比较PUBLIC_URL是什么和你的相对路径,你会发现你的相对路径指向了错误的地方。

标签: reactjs external-js


【解决方案1】:

脚本将在浏览器中运行。所以你必须使用绝对路径。并且路径必须在您的服务器中提供。

通常,对于 express,有一个中间件供您选择应提供静态文件的位置。 https://expressjs.com/en/starter/static-files.html

检查你的代码,也许有

app.use(express.static('public'))

现在针对您的情况,如果您想从src/component/ui 提供脚本文件。你可以这样修改代码:

app.use(express.static('src/component/ui'))

现在你的脚本会是这样的:

<script src="/JS/jQuery-2.1.4.min.js" type="text/babel"></script>
<script src="/BOOTSTRAP-JS/bootstrap.min.js" type="text/babel"></script>
<script src="/JS/app.min.js" type="text/babel"></script>

【讨论】:

  • 在反应中不使用 express 的任何其他选择?
  • 你使用的是 Create React App 还是什么?
  • 我是新手,是的,我正在使用 create react app
  • 所以在 CreateReactApp 的文档中说,Only files inside public can be used from public/index.html.
  • 但是我发现了一些有用的信息,可以通过在你的 .env 文件中设置 PUBLIC_URL create-react-app.dev/docs/advanced-configuration/# 来更改公共 url!
猜你喜欢
  • 2019-05-16
  • 2018-01-09
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2020-12-13
  • 2020-04-19
  • 2021-10-16
  • 2023-03-18
相关资源
最近更新 更多