create-react-app 创建项目有关less的若干问题

栏目: 服务器 · 发布时间: 6年前

内容简介:创建发现test的颜色并没有生效修改webpack配置 修改

创建 test.less ,并在 App.js 中引入

.test {
  color: red;
}
复制代码
// App.js
...
import './test.less'
...
 <div className="test">test</div>
 <Button type="primary">Button</Button>
...
复制代码

发现test的颜色并没有生效

create-react-app 创建项目有关less的若干问题

安装 less 和 less-loader ,并修改webpack配置

$ cnpm i less less-loader --save-dev
复制代码

修改webpack配置 修改 webpack.config.dev.jswebpack.config-prod.js 配置文件, 增加less文件配置:

// webpack.config.dev.js
...
  {
    test: /\.less$/,
    use: [
      require.resolve('style-loader'),
      {
        loader: require.resolve('css-loader'),
        options: {
          importLoaders: 1,
        },
      },
      {
        loader: require.resolve('less-loader') // compiles Less to CSS
      }
    ],
  },
...
复制代码

重启项目后,less样式已经生效

create-react-app 创建项目有关less的若干问题

antd 样式使用 less 形式引入

babel-plugin-import 中对style有这样对说明:

["import", { "libraryName": "antd" }] : import js modularly

["import", { "libraryName": "antd", "style": true }] : import js and css modularly (LESS/Sass source files)

["import", { "libraryName": "antd", "style": "css" }] : import js and css modularly (css built files)

修改package.json,将 style 的值改为 true

...
  "babel": {
    "presets": [
      "react-app"
     ]
     ],
    "plugins": [
      ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": true }]
    ]
  }
...
复制代码

重启之后,编译错误

create-react-app 创建项目有关less的若干问题

按照报错提供的issue地址查看 : github.com/ant-design/… 主要有2种解决方式

  • 将 less 版本降到 3.0 以下, 应该可行,没有测试
  • less loader 增加配置,开启 JavaScript :
// webpack.config.dev.js
...
  {
-    loader: require.resolve('less-loader') // compiles Less to CSS
+    loader: require.resolve('less-loader'), // compiles Less to CSS
+    options: {
+        javascriptEnabled: true
+    }
    
  }
复制代码

重新 npm start ,项目可以正常启动。

antd使用本地字体

Ant Design 默认的 iconfont 文件托管在 iconfont.cn 并默认使用平台提供的 alicdn 地址,公网可访问使用。

由于 alicdn 对部分域名有访问限制,或者需要内网环境使用,需要将字体下载到本地

最新的 iconfont 文件可以到此链接 下载。

create-react-app 创建项目有关less的若干问题

下载后将字体文件放入 public/iconfont/ 路径下

由于项目使用的是create-react-app创建项目,且antd的样式使用 babel-plugin-import 按需加载样式,所以只能采用定制主题中的 less-loadermodifyVars 配置来覆盖原来的样式变量。

具体改动 修改 webpack.config.dev.jswebpack.config-prod.js 配置文件

// webpack.config.dev.js
...
  {
     loader: require.resolve('less-loader'), // compiles Less to CSS
     options: {
        javascriptEnabled: true,
        modifyVars: {
          "icon-url": "'/public/iconfont/iconfont'"
        }
     }
  }
复制代码

重启项目,成功引入了本地字体

create-react-app 创建项目有关less的若干问题

需要注意的是 webpack.config-prod.js 文件中的 icon-url 路径需要将 public 替换为生产环境项目文件路径,打包之后 public 中的文件和文件夹直接复制到 bulid 路径下。使用相对路径会报错无法编译,这点不知道有没有更好的处理方式,希望读者大神们提供更好的方式。

// webpack.config-prod.js
...
  {
     loader: require.resolve('less-loader'), // compiles Less to CSS
     options: {
        javascriptEnabled: true,
        modifyVars: {
          "icon-url": "'/your-project-name/iconfont/iconfont'"
        }
     }
  }
复制代码

css module 形式引入less

增加 css-loader 的配置

{
            test: /\.less$/,
            // exclude: [/node_modules/],
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                   importLoaders: 1,
+                  modules: true
                },
              },
              {
                loader: require.resolve('less-loader'), // compiles Less to CSS
                options: {
                  javascriptEnabled: true,
                  modifyVars: {
                    "icon-url": "'/public/iconfont/iconfont'"
                  }
                }
              }
            ],
          },
复制代码

修改 App.js ,使用css module方式引入

- import './test.less'
+ import styles from './test.less'

    class App extends Component {
      render() {
        return (
          <div className="App">
-           <div className="test">test</div>
+           <div className={styles.test}>test</div>
            <Button type="primary">Button</Button>
          </div>
        );
      }
    }
复制代码

重启项目,css module引入的test样式生效了,但是antd的按钮样式失效了

create-react-app 创建项目有关less的若干问题

需要修改 webpack.config.dev.js ,只对 src 中的 less 文件开启 css module ,这里写法有点麻烦,应该有更好的方式。

// webpack.config.dev.js
...
          {
            test: /\.less$/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1
                },
              },
              {
                loader: require.resolve('less-loader'), // compiles Less to CSS
                options: {
                  javascriptEnabled: true,
                  modifyVars: {
                    "icon-url": "'/public/iconfont/iconfont'"
                  }
                }
              }
            ],
          },
          {
            test: /\.less$/,
            include: [/src/],
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                  modules: true
                },
              }
            ],
          },
...
复制代码

总结

本文在 ejectcreate-react-app 的项目基础上,按需引入了 antd ,遇到了有关 less 的若干问题:解决了 less 文件不生效的问题,内网环境使用本地 iconfont 的配置方式, css module 的配置方式。本文还有一些配置方式不是最优的方式,希望各位能够给出更好的方案。

最近在起步 React ,准备记录以下自己的学习和踩坑过程。下一篇文章应该是 dva 的使用。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人人都是产品经理2.0

人人都是产品经理2.0

苏杰 / 电子工业出版社 / 2017-5 / 66.6

《人人都是产品经理2.0——写给泛产品经理》继续定位在-1~3 岁的产品经理。这里特别要强调,“-1 岁”指的是“泛产品经理”群体,比如自认为是“产品新人”的“职场老人”,需要自己做产品的早期创业者,对产品感兴趣并且工作中可能要承担部分职责的技术、设计、运营等人员,其他行业对互联网产品感兴趣的从业者等,《人人都是产品经理2.0——写给泛产品经理》可以说是为他们量身定做的。 内容方面,《人人都......一起来看看 《人人都是产品经理2.0》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具