Css

安装loader

yarn add style-loader css-loader -D

配置

config/webpack.common.js
        ...        function webpackCommonConfigCreator(options){            ...            return {                ...                module: {                    rules: [                        ...                        + {                        +     test: /\.css$/,                        +     include: path.resolve(__dirname, '../src'),                        +     use: ["style-loader", "css-loader"]                        + }                    ]                },                ...            }        }

创建src/app.css

src/app.css
        .text{            font-size: 20px;            color: brown;        }
src/App.js
        + import './app.css';        function App(){            return (                - <div>                + <div className="text">                    hello react                </div>            )        }        ...

yarn start, 效果:

Scss

安装loader

    yarn add sass-loader node-sass -D

配置loader

config/webpack.common.js
        ...        function webpackCommonConfigCreator(options){            ...            return {                ...                module: {                    rules: [                        ...                        {                        -    test: /\.css/,                        +    test: /\.(css|scss)$/,                            include: path.resolve(__dirname, '../src'),                        -    use: ["style-loader", "css-loader"]                        +    use: ["style-loader", "css-loader", "sass-loader"]                        }                    ]                },                ...            }        }

创建src/app.scss

src/app.scss
        .title{            font-size: 18px;            font-weight: 800;            color: #333;            text-decoration: underline;        }
src/App.js
        - import './app.css';        + import './app.scss';        function App(){            return (                - <div className="text">                + <div className="title">                    hello react                </div>            )        }        ...

yarn start, 效果:

配置css-module模式

修改配置

config/webpack.common.js
        ...        function webpackCommonConfigCreator(options){            ...            return {                ...                module: {                    rules: [                        ...                        {                            ...                            - use: ["style-loader", "css-loader", "sass-loader"]                            + use: [                            +         "style-loader",                             +         {                            +             loader: "css-loader",                            +             options: {                            +                 modules: {                            +                     mode: "local",                            +                     localIdentName: '[path][name]_[local]--[hash:base64:5]'                            +                 },                            +                 localsConvention: 'camelCase'                            +             }                            +         },                             +         "sass-loader"                            + ]                        }                    ]                },                ...            }        }
src/App.js
        - import './app.scss';        + import styles from './app.scss';        function App(){            return (                - <div className="title">                + <div className={styles.title}>                    hello react                </div>            )        }        export default hot(App);

yarn start

现在编译后的css由js动态内联在html中,需要分离到单独的文件

安装插件extract-text-webpack-plugin, 注意最新版才支持webpack4

yarn add extract-text-webpack-plugin@next -D

配置

config/webpack.common.js
        ...        + const ExtractTextPlugin = require('extract-text-webpack-plugin');        ...        module: {            rules: [                ...                {                    test: /\.(css|scss)$/,                    include: path.resolve(__dirname, '../src'),                    - use: [                    -     "style-loader",                     -     {                    -         loader: "css-loader",                    -         options: {                    -             modules: {                    -                 mode: "local",                    -                 localIdentName: '[path][name]_[local]--[hash:base64:5]'                    -             },                    -             localsConvention: 'camelCase'                    -         }                    -     },                     -     "sass-loader"                    - ]                    + use: ExtractTextPlugin.extract({                    +     fallback: "style-loader",                    +     use: [                    +         {                    +             loader: "css-loader",                    +             options: {                    +                 modules: {                    +                     mode: "local",                    +                     localIdentName: '[path][name]_[local]--[hash:base64:5]'                    +                 },                    +                 localsConvention: 'camelCase'                    +             }                    +         },                     +         "sass-loader"                    +     ]                    + })                },                ...            ]        },        plugins: [            ...            new ExtractTextPlugin({                filename: "[name][hash].css"            }),        ]

yarn build, 效果:

使用postcss对css3属性添加前缀

安装

yarn add postcss-loader postcss-import autoprefixer -D

配置

config/webpack.common.js
        module: {            rules: [                ...                {                    test: /\.(css|scss)/,                    use: ExtractTextPlugin.extract({                        fallback: "style-loader",                        use: [                            ...                            + {                            +     loader: "postcss-loader",                            +     options: {                            +         ident: 'postcss',                            +         plugins: loader => [                            +             require('postcss-import')({ root: loader.resourcePath }),                            +             require('autoprefixer')()                            +         ]                            +     }                            + }                        ]                    })                },                ...            ]        }

对生产模式下的css进行压缩

安装

yarn add optimize-css-assets-webpack-plugin -D

配置

config/webpack.prod.js
        + const optimizeCss = require('optimize-css-assets-webpack-plugin');        const config = {            + plugins: [            +     new optimizeCss({            +         cssProcessor: require('cssnano'),            +         cssProcessorOptions: { discardComments: { removeAll: true } },            +         canPrint: true            +     }),            + ],        }        ...

yarn build, 效果:

css相关配置完了,当然还有一些静态资源的配置

字体

安装loader

yarn add file-loader -D

配置

config/webpack.common.js
        module: {            rules: [                ...                + {                +     test: /\.(woff|woff2|eot|ttf|otf)$/,                +     use: ['file-loader']                + },            ]        },

图片

安装loader

yarn add url-loader -D

配置

config/webpack.common.js
        module: {            rules: [                ...                + {                +     test: /\.(jpg|png|svg|gif)$/,                +     use: [                +         {                +             loader: 'url-loader',                +             options: {                +                 limit: 10240,                +                 name: '[hash].[ext]',                +             }                +         },                +     ]                + },            ]        }

添加两张图片

  • src/assets/small.jpg -- 6kb
  • src/assets/bigger.jpg -- 20kb

引入图片

src/App.js
        + import small_pic from './assets/small.jpg';        + import bigger_pic from './assets/bigger.jpg';        function App(){            return (                <div className={styles.title}>                    hello react                    + <img src={small_pic} alt="" />                    + <img src={bigger_pic} alt="" />                </div>            )        }        export default hot(App);

效果

可以看到,小于10k的图片编译成了base64格式,而大于10k的图片以链接形式赋值给src, 由url-loader的limit选项决定界限


未完待续!