手动搭webpack + React Hooks + TypeScript + Antd(三)

560 阅读1分钟

前篇见

手动搭webpack + React Hooks + TypeScript + Antd(一)
手动搭webpack + React Hooks + TypeScript + Antd(二)

本篇讲css less的配置与css-module

在home文件夹下新建index.css并随便写入一个css 然后在index.tsx中导入

src/pages/home/index.css

.home {
    border: 1px solid #f00;
}

src/pages/home/index.tsx

+ import './index.css';
页面编译报错

因为webpack默认只会处理js代码,所以当我们想要去打包其他内容时,让webpack处理其他类型的内容,就要使用相应的loader,loader:是webpack用来预处理模块的,在一个模块被引入之前,会预先使用loader处理模块的内容。

安装 css-loader

yarn add css-loader -D

build/webpack.dev.js

devServer: { ... }

+ module: {
+    rules: [
+        {
+            test: /\.css$/,
+            include: resolve( '../src'),
+            use: ["css-loader"]
+        }
+    ]
+ },

plugins: [ ... ]

重新run start报错是没有了,但是页面并没有相应的css样式,因为css-loader是处理css的,并不会将处理后的css引入至html中

安装style-loader

yarn add style-loader -D

修改use 后重新run start

build/webpack.dev.js

-  use: ["css-loader"]
+  use: ["style-loader", "css-loader"]

但是现在一般使用less 或者sass(这里使用less,因为后面要加载antd)

安装less less-loader

yarn add less less-loader -D

将index.css修改成less再引入,再修改配置后重新run生效

{
    test: /\.less$/,
    include: resolve( '../src'),
    use: ['style-loader', 'css-loader', 'less-loader']
}

src/pages/home/index.less

.home {
    border: 1px solid #f00;
    .text {
        color: #f00;
    }
}
打开页面,已经成功编译

但是由于css的全局性,修改了某个文件的css样式,可能其他文件也被修改了,所以需要CSS Modules 修改配置

build/webpack.dev.js

      {
        test: /\.less$/,
        include: resolve("../src"),
        use: [
          "style-loader",
          {
            loader: "css-loader",
            options: {
              modules: {
                localIdentName: "[name]__[local]--[hash:base64:5]",
              },
            },
          },
          "less-loader",
        ],
      },

重新run, 然后发现页面的样式没有了

在页面中通过变量使用className

页面样式即生效,但是ts会报找不到less模块,ts中有些文件的结尾不是* .ts,你必须为相应的文件类型声明一个通配符模块。只需将它放在项目中包含的* .d.ts文件中即可。

在type文件夹下新建css-modules.d.ts文件 写入下面声明

参考 ts css model 报错找不到模块问题

types/css-modules.d.ts

declare module '*.less' {  
    const content: any; 
    export default content;
}

ts报错即可解决。

如果css样式是.home-index这种,那么引入需要写成className={styles['home-index']}比较麻烦,所以可以这么使用className={styles.homeIndex}

需要修改webpack配置`exportLocalsConvention`为驼峰即可

build/webpack.dev.js

modules: {
    localIdentName: '[name]__[local]--[hash:base64:5]',
+   exportLocalsConvention: 'camelCase',
}

一般css不直接放在html的style中,而是通过link引入,安装mini-css-extract-plugin

安装mini-css-extract-plugin

yarn add mini-css-extract-plugin -D
build文件夹下新建config.js, 将css loader抽出

build/config.js

const cssLoaderConfig = [
  "style-loader",
  {
    loader: "css-loader",
    options: {
      modules: {
        localIdentName: "[name]__[local]--[hash:base64:5]",
        exportLocalsConvention: "camelCase",
      },
    },
  },
  "less-loader",
];

module.exports = {
  cssLoaderConfig,
};

build/webpack.prod.js

+ const { cssLoaderConfig } = require('./config');
+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = merge(common, {
  mode: "production",
  module: {
    rules: [
      {
        test: /\.less$/,
        exclude: /node_modules/,
        use: [MiniCssExtractPlugin.loader, ...cssLoaderConfig.slice(1)],
      },
    ],
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].[hash].css",
      chunkFilename: "[id].css",
    }),
  ],
});

npm run build后的文件夹

然后cd dist,再npx http-server(没有npx需要全局安装npx)即可在浏览器中浏览prod的运行情况。

一般css放在css文件夹 js放在js文件夹,修改filename即可

build/webpack.prod.js

new MiniCssExtractPlugin({
    filename: 'css/[name].[hash].css',
    chunkFilename: 'css/[id].[hash].css',
}),

build/webpack.common.js

output: {
    path: resolve('../dist'),
    filename: 'js/[name].[hash].js',
    chunkFilename: 'js/[name].[chunkhash].js',
},

至此,css less css-module已经成功配置,下一章引入img svg等

后文

手动搭webpack + React Hooks + TypeScript + Antd(四)

手动搭webpack + React Hooks + TypeScript + Antd(五)