Web

虽然,我们在上一步已经可以看到React组件在页面上显示,下面还需要针对一个真实的Web项目的需求做更多的配置。

CSS/SASS Loader

如果你仍然习惯于将样式写在CSS/SASS中(而不是JavaScript中),此时可能会需要:Webpack CSS LoaderWebpack SASS Loader

以SASS Loader为例:

yarn add sass-loader css-loader style-loader --dev

修改webpack.config.js:

module: {
  rules: [
    ...
    {
      test: /\.scss$/,
      use: [{
        loader: "style-loader"
      }, {
        loader: "css-loader",
        options: { modules: true, localIdentName: '[path][name]__[local]--[hash:base64:5]' }
      }, {
        loader: "sass-loader"
      }]
    }
  ]
},

这里应用了CSS-Loader提供的CSS Modules特性,能够在编译的时候自动的给CSS类名提供适当的命名空间(前缀),关于CSS Modules的更多细节,请查看 CSS Modules

修改目录结构,我们将之前写在app/index.js中的HelloMessage组件移动到/app/components/HelloMessage/目录下,如下:

.
├── README.md
├── app
│   ├── components
│   │   └── HelloMessage
│   │       ├── index.jsx
│   │       └── styles.scss
│   ├── index.html
│   └── index.js
├── dist
│   ├── app.bundle.js
│   └── index.html
├── node_modules
├── package.json
├── webpack.config.js
└── yarn.lock

/app/components/HelloMessage/index.jsx

import React from 'react';
import styles from './styles.scss';

class HelloMessage extends React.Component {
  render() {
    return <div className={styles.red}>Hello, {this.props.message}</div>;
  }
}

export default HelloMessage;

./styles.scss

.red {
  color: red;
}

修改app/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import HelloMessage from './components/HelloMessage';

ReactDOM.render(<HelloMessage message="My First React App" />, document.getElementById('app'));

还没结束,因为这里是这样引入组件的import HelloMessage from './components/HelloMessage';省略了index.jsx,我们还需给webpack添加一点配置:

const config = {
    ...
    resolve: {
        extensions: ['.js', '.jsx', '.json']
    },
}

可以帮助自动解析对应的扩展名,更详细的解释,请查看resolve-extensions

完成以上修改之后,就可以看到样式应用到DOM上,此时,可以查看(Inspect)一下元素,可以看到对应的编译之后的class名。

File Loader

除了样式,我们还需要处理一系列的assets,比如:图片资源,字体资源,所以你需要File Loader:

yarn add file-loader --dev

webpack.config.js

{
  test: /\.(png|svg|jpg|gif)$/,
  use: [
    'file-loader'
  ]
}
.red {
    color: red;
}

.logo {
    background-image: url("./logo.svg");
    background-repeat: no-repeat;
    background-position: center center;
    height: 22px;
    width: 22px;
    display: inline-block;
    vertical-align: middle;
}

logo.svg下载

import React from 'react';
import styles from './styles.scss';

class HelloMessage extends React.Component {
  render() {
    return (<div className={styles.red}>Hello, {this.props.message}<div className={styles.logo}></div></div>);
  }
}

export default HelloMessage;

File Loader会配合CSS Loader将样式中定义的url('./logo.svg')拷贝到dist目录。

Normalize.css

为了保证浏览器的样式一致性,我这里引入了Normalize.css。首先需要添加css-loader:

{
  test: /\.css$/,
  use: [
    { loader: 'style-loader' },
    { loader: 'css-loader' },
  ]
},
import React from 'react';
import ReactDOM from 'react-dom';
import HelloMessage from './components/HelloMessage';
import 'normalize.css';

ReactDOM.render(<HelloMessage message="My First React App" />, document.getElementById('app'));

当然,也可以单独在HTML中引入。

PostCSS

什么是PostCSS,我们要使用到PostCSS-Loader

webpack.config.js

{
  test: /\.scss$/,
  use: [{
    loader: "style-loader"
  }, {
    loader: "css-loader",
    options: { modules: true, localIdentName: '[path][name]__[local]--[hash:base64:5]' }
  }, {
    loader: "postcss-loader"
  }, {
    loader: "sass-loader"
  }]
},

./postcss.config.js

module.exports = {
   plugins: [
      require('autoprefixer')
   ]
};

它的作用是:

:fullscreen {}

//输出如下

:-webkit-:full-screen {}
:-moz-:full-screen {}
:full-screen {}

代码

你可以在prepare-env分支查看到当前步骤所有的代码

git clone [email protected]:ThoughtWorksWuhanUI/react-zero-to-one.git
git checkout prepare-env

本页编辑:Benwei

results matching ""

    No results matching ""