create-react-app中的src / images文件夹

时间:2018-06-06 21:35:56

标签: javascript reactjs webpack create-react-app

我有一个使用create-react-app搭建的app。我想有这样的文件夹结构:

src/
  components/
    CustomAppBar.js
  images/
    logo.svg
  App.js
  index.tsx
images.d.ts

目前我想在logo.svg的images文件夹中使用CustomAppBar.js。目前此文件如下所示:

import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import Button from '@material-ui/core/Button';
import IconButton from '@material-ui/core/IconButton';
import MenuIcon from '@material-ui/icons/Menu';
import logo from '*.svg';

const styles = {
  flex: {
    flex: 1,
  },
  menuButton: {
    marginLeft: -12,
    marginRight: 20,
  },
  root: {
    flexGrow: 1,
  },
};

function ButtonAppBar(props) {
  const { classes } = props;
  return (
    <div className={classes.root}>
      <AppBar position="static" title={<img styles={{height: '50px'}} src={logo} />}>
        <Toolbar>
          <IconButton className={classes.menuButton} color="inherit" aria-label="Menu">
            <MenuIcon />
          </IconButton>
          <Typography variant="title" color="inherit" className={classes.flex}>
            Title
          </Typography>
          <Button color="inherit">Login</Button>
        </Toolbar>
      </AppBar>
    </div>
  );
}

ButtonAppBar.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(ButtonAppBar);

正如所料,这失败了:

Module not found: Can't resolve '*.svg' in 'some\path\src\components

images.d.ts的内容是股票标准:

declare module '*.svg'
declare module '*.png'
declare module '*.jpg'

我在其他地方发现了一些提及修改Webpack配置的建议。似乎create-react-app隐藏了Webpack配置的东西。什么是最佳实践?

2 个答案:

答案 0 :(得分:8)

我通常为/public/assets下的资产执行的操作i导入我的文件然后使用src在我的反应组件中我可以使用process.env.PUBLIC_URL + '/assets/{ENTER REST OF PATH HERE}'

访问它们

这是我如何实现它的代码示例。

import React, { Component } from 'react';

const iconPath = process.env.PUBLIC_URL + '/assets/icons/';

export default class TestComponent extends Component {
    constructor(props) {
        super(props);
    }
    render(){
    return (<img
        src={`${iconPath}icon-arrow.svg`}
        alt="more"
    />)
    }
}

这是让我开始以这种方式实现它的链接。 https://github.com/facebook/create-react-app/issues/2854

我还注意到您输入的徽标不正确,应该是import logo from '../images/logo.svg',或者如果logo.svg没有导出默认值,那么您应该使用import {logo} from '../images/logo.svg'

答案 1 :(得分:1)

您可以使用ES6导入从根文件夹中找到任何文件(图像,音频等)并将其添加到您的应用中。

import React from 'React'
import errorIcon from './assets/images/errorIcon.svg'
import errorSound from './assets/sounds/error.wav'

class TestComponent extends React.Component 
{ 
    render() 
    {
        return (

            <div>
                <img src={ errorIcon }
                     alt="error Icon" />

                <audio src={ errorSound } />
            </div>
        )
    }
}