create-react-app 环境 and + css module + scss + mobx

react 中目前最好用的脚手架就是官方推荐的create-react-app,二话不说先用起来

yarn的使用

初始化

yarn global create-react-app 
mkdir react-demo  // 创建react-demo 文件
cd react-demo // 进入文件
create-react-app . // 脚手架配环境
yarn // 安装依赖

package.json

yarn run eject // 暴露出更多的配置
yarn  // 再次安装一遍依赖

安装配置antd

yarn add antd 
yarn add babel-plugin-import --save-dev // 按需加载

在webpack.config.dev.js

// Process JS with Babel.
{
    test: /\.(js|jsx|mjs)$/,
    include: paths.appSrc,
    loader: require.resolve('babel-loader'),
    options: {
    +   plugins: [
    +       ['import', [{libraryName: "antd", style: 'css'}]],
    +   ],
        // This is a feature of `babel-loader` for webpack (not Babel itself).
        // It enables caching results in ./node_modules/.cache/babel-loader/
        // directory for faster rebuilds.

        cacheDirectory: true,
    },
},

在webpack.config.prod.js

// Process JS with Babel.
{
    test: /\.(js|jsx|mjs)$/,
    include: paths.appSrc,
    loader: require.resolve('babel-loader'),
    options: {
        plugins: [
            ['import', [{libraryName: "antd", style: 'css'}]],
        ],
        compact: true,
    },
},

使用

import React, { Component } from 'react';
import { Button } from 'antd';


export default class Demo extends Component {
    render() {
        return (
            
); } }

配置css moudule

css按需加载 和 antd 的按需加载会存在一定冲突
所以css-loader分别设置两处,
include node_modules依赖,用来处理antd的按需加载,
exclude node_modules用来处理css的按需加载

webpack.config.dev.js

{
    test: /\.css$/,
    exclude: /node_modules|antd\.css/,
    use: [
        require.resolve('style-loader'),
        {
            loader: require.resolve('css-loader'),
            options: {
                importLoaders: 1,
                // 改动
                modules: true,   // 新增对css modules的支持
                localIdentName: '[name]__[local]__[hash:base64:5]', //
            },
        },
        {
            loader: require.resolve('postcss-loader'),
            options: {
                // Necessary for external CSS imports to work
                // https://github.com/facebookincubator/create-react-app/issues/2677
                ident: 'postcss',
                plugins: () => [
                    require('postcss-flexbugs-fixes'),
                    autoprefixer({
                        browsers: [
                            '>1%',
                            'last 4 versions',
                            'Firefox ESR',
                            'not ie < 9', // React doesn't support IE8 anyway
                        ],
                        flexbox: 'no-2009',
                    }),
                ],
            },
        },
    ],
},
// antd 的css配置
{
    test: /\.css$/,
    include: /node_modules|antd\.css/,
    use: [
        require.resolve('style-loader'),
        {
            loader: require.resolve('css-loader'),
            options: {
                importLoaders: 1,
                // 改动
                // modules: true,   // 新增对css modules的支持
                // localIdentName: '[name]__[local]__[hash:base64:5]', //
            },
        },
        {
            loader: require.resolve('postcss-loader'),
            options: {
                // Necessary for external CSS imports to work
                // https://github.com/facebookincubator/create-react-app/issues/2677
                ident: 'postcss',
                plugins: () => [
                    require('postcss-flexbugs-fixes'),
                    autoprefixer({
                        browsers: [
                            '>1%',
                            'last 4 versions',
                            'Firefox ESR',
                            'not ie < 9', // React doesn't support IE8 anyway
                        ],
                        flexbox: 'no-2009',
                    }),
                ],
            },
        },
    ],
},

webpack.config.prod.js

{
    test: /\.css$/,
    exclude: /node_modules|antd\.css/,
    loader: ExtractTextPlugin.extract(
        Object.assign(
            {
                fallback: {
                    loader: require.resolve('style-loader'),
                    options: {
                        hmr: false,
                    },
                },
                use: [
                    {
                        loader: require.resolve('css-loader'),
                        options: {
                            importLoaders: 1,
                            modules: true,
                            minimize: true,
                            sourceMap: shouldUseSourceMap,
                        },
                    },
                    {
                        loader: require.resolve('postcss-loader'),
                        options: {
                            // Necessary for external CSS imports to work
                            // https://github.com/facebookincubator/create-react-app/issues/2677
                            ident: 'postcss',
                            plugins: () => [
                                require('postcss-flexbugs-fixes'),
                                autoprefixer({
                                    browsers: [
                                        '>1%',
                                        'last 4 versions',
                                        'Firefox ESR',
                                        'not ie < 9', // React doesn't support IE8 anyway
                                    ],
                                    flexbox: 'no-2009',
                                }),
                            ],
                        },
                    },
                ],
            },
            extractTextPluginOptions
        )
    ),
    // Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
},
{
    test: /\.css$/,
    include: /node_modules|antd\.css/,
    loader: ExtractTextPlugin.extract(
        Object.assign(
            {
                fallback: {
                    loader: require.resolve('style-loader'),
                    options: {
                        hmr: false,
                    },
                },
                use: [
                    {
                        loader: require.resolve('css-loader'),
                        options: {
                            importLoaders: 1,
                            minimize: true,
                            sourceMap: shouldUseSourceMap,
                        },
                    },
                    {
                        loader: require.resolve('postcss-loader'),
                        options: {
                            // Necessary for external CSS imports to work
                            // https://github.com/facebookincubator/create-react-app/issues/2677
                            ident: 'postcss',
                            plugins: () => [
                                require('postcss-flexbugs-fixes'),
                                autoprefixer({
                                    browsers: [
                                        '>1%',
                                        'last 4 versions',
                                        'Firefox ESR',
                                        'not ie < 9', // React doesn't support IE8 anyway
                                    ],
                                    flexbox: 'no-2009',
                                }),
                            ],
                        },
                    },
                ],
            },
            extractTextPluginOptions
        )
    ),
    // Note: this won't work without `new ExtractTextPlugin()` in `plugins`.
},

使用Sass

yarn add node-sass-chokidar --save-dev

然后在package.json中,将以下行添加到scripts中:

"scripts": {
+    "build-css": "node-sass-chokidar src/ -o src/",
+    "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
     "start": "react-scripts start",
     "build": "react-scripts build",
     "test": "react-scripts test --env=jsdom",

npm 命令并行

yarn add  --save-dev npm-run-all
    "build-css": "node-sass-chokidar src/ -o src/",
    "watch-css": "npm run build-css && node-sass-chokidar src/ -o src/ --watch --recursive",
    "start-js": "node scripts/start.js",
    "start": "npm-run-all -p watch-css start-js",
    "build": "npm run build-css && node scripts/build.js",
    "test": "node scripts/test.js --env=jsdom"

mobx

因为create-react-app不支持功能,需要配置babel

yarn add babel-plugin-transform-decorators-legacy --dev

编辑package.json

"babel": {
    "plugins": [ "transform-decorators-legacy" ],
    "presets": [
      "react-app"
    ]
  },

安装mobx

yarn add mobx mobx-react

参考文章

How to Use CSS Modules with Create React App
如何在create-react-app中使用sass
antd官方

你可能感兴趣的:(create-react-app 环境 and + css module + scss + mobx)