如何将 React 组件正确存储在单独的文件中并导入 React?

IT技术 javascript reactjs babeljs
2021-05-23 14:07:52

我已经完成了一些 React 教程的介绍,并且正在尝试使用我迄今为止的一些知识。我已经成功地在 a 内部创建了一些组件,<script type='text/babel'>并使用 babel 将browser.js其转换为浏览器中的 JS 客户端。

但是,我现在试图将我的组件分解为单独的文件,对其进行转换,然后将转换后的 JS 提供给客户端,而不是在客户端进行转换。

我对如何将 ReactJS 正确导入到我的组件 JSX 文件中感到困惑。之前没有构建过大型JS应用,所以不熟悉将库导入其他module的方法。

这是我的组件 JSX 文件之一:

var SidebarFilter = React.createClass({
  render: function() {
    return (
        <div className="btn-group">
          Some markup removed for brevity. 
        </div>
    );
  }
});

在我的主 html 文件中,如果我有:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.js"></script>

<script>为我的组件添加任何标签之前,一切正常。但是如果将组件放在 react/reactdom 脚本标签之上,则不起作用。

我已经看到 javascript 有一个import,也有require,但我不确定有什么区别,哪个更好用,以及如果其中一个/两者都需要任何额外的构建,或者它们是否在浏览器中正确使用。

谢谢!

2个回答

如果您只是在学习 react,那么您使用 script 标签的方式就在 html 中。

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.js"></script>

如果您想开发一个可以部署到生产环境的应用程序,您需要遵循以下步骤。毫无疑问,互联网上有更好的教程,但它会给你一些想法。

1.需要Browserfiy或Webpack:

在浏览器中,您不能像编写 node.js 代码时通常那样使用modulerequireimportmodule。Browserify/Webpack的帮助下,您可以编写require/import与在节点环境中使用相同的方式使用的代码我假设你会使用webpack考虑到它的受欢迎程度。

2.安装依赖(es6)

这些是项目 ( package.json) 中需要的最小依赖项以使其正常工作

  "devDependencies": {
        "babel-cli": "^6.3.17",
        "babel-core": "^6.3.21",
        "babel-eslint": "^5.0.0-beta6",
        "babel-loader": "^6.2.0",
        "babel-preset-es2015": "^6.3.13",
        "babel-preset-react": "^6.3.13",
        "babel-preset-stage-3": "^6.3.13",
        "css-loader": "^0.23.0",
        "eslint": "^1.10.3",
        "eslint-loader": "^1.1.1",
        "eslint-plugin-react": "^3.12.0",
        "style-loader": "^0.13.0",
        "webpack": "^1.12.9",
        "webpack-dev-server": "^1.14.0"
      },
      "dependencies": {
        "react": "^15.0.0-rc.1",
    "react-dom": "^15.0.0-rc.1"

3.编写你的 webpack-config.js 文件

示例webpack配置文件应该是这样的。不要问我关于它的每一点,而是查看webpack教程,因为我无法在这里解释所有内容。请记住一个事实, Webpack即为javascript浏览器捆绑和其他资产的module捆绑器。

var path    = require('path');
var webpack = require('webpack');

module.exports = {
  devtool: 'source-map',
  entry: {
    main: [
      'webpack-dev-server/client?http://localhost:8080',
      'webpack/hot/only-dev-server',
      './src/index.js'
    ]
  },
  output: {
    path: path.join(__dirname, 'public'),
    publicPath: 'http://localhost:8080/public/',
    filename: 'bundle.js'
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  module: {
   loaders: [
      {
        test      : /\.jsx?$/,
        include   : path.join(__dirname, 'src'),
        loader    : 'react-hot!babel'
      },
      {
        test      : /\.scss$/,
        include   : path.join(__dirname, 'sass'),
        loaders   : ["style", "css?sourceMap", "sass?sourceMap"]
      },
      {
          test    : /\.(png|jpg|svg)$/,
          include : path.join(__dirname, 'img'),
          loader  : 'url-loader?limit=30000&name=images/[name].[ext]'
     } // inline base64 URLs for <=30k images, direct URLs for the rest
    ]
  },
  resolve: {
    extensions: ['', '.js', '.jsx']
  },
  devServer: {
    historyApiFallback: true,
    contentBase: './'
  }
};

4.为您的应用程序设置入口点和路由

src->index.js src->routes.js

索引.js

import React from 'react';
import ReactDOM from 'react-dom';
import {Router,browserHistory} from 'react-router';
import routes from './routes';

ReactDOM.render(
    <Router routes={routes} history={browserHistory}/>
  , document.querySelector('.init')
);

路由.js

import React from 'react';
import { Route, IndexRoute } from 'react-router';
import App from './components/app';
import Home from './components/home';


module.exports = (
       <Route path="/" component={App}>
           <IndexRoute component={Home}/>
       </Route>
)

5.在你的项目根目录中设置 index.html

<!DOCTYPE html>
<html>
  <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>Welcome to ReactJs</title>
  </head>
  <body>
    <div class="init"></div>
  </body>
  <script src="./public/bundle.js"></script>
</html>

6.跑步

形成您的项目根类型

webpack-dev-server --progress --colors

导入并要求

import并且require在功能上非常相似。唯一的区别是import新的语法糖可用于 es6 而require用于 es5。

双方importrequire使用module化的JavaScript应用程序,但他们来自不同的地方:

进口

import语句是 ES6 的一部分,如果您已经在项目中使用 ES6 和 babel,则可以很好地使用它。它将先前导出的module(或其某些部分)导入到声明它的文件中。

所以,import React, { PropTypes, Component } from 'react'我们只从 react module导入 PropTypes 和 Component 成员,所以我们不必导入整个“react”module和我们需要的成员,我们将它分配给React变量。

您可以import 在此处阅读更多信息

要求

require语句是 Node.js module加载系统的一部分,其作用与 ES6 相同import它允许您导入以前导出的module或其中的一部分。

var React = require('react')正在将整个reactmodule导入到React变量中。

您可以在此处阅读有关 Node.js module系统的更多信息

对于这两种情况,我们导入的module可以来自不同的来源,例如来自 npm 下载的库(如“react”)或来自您自己的文件,例如您创建和导出的组件。在第二种情况下,由于它不是来自“node_modules”文件夹的 npm 下载module,因此我们必须写入文件的路径。例如:

import MyComponent from './components/MyComponent.js';

或者

var MyComponent = require(./components/MyComponent.js;

您可以使用您喜欢的任何一种。

导出module

要导出module,您有两个相同的选项,Node.jsmodule加载系统和ES6

如您所见,您的下一步将是使用 Node.js 作为构建 React 应用程序的环境以及 Webpack 或 Gulp 等构建工具之一,以进行转译、缩小等。您可以从Cerad 在他的评论中指出的 Webpack 教程。