说在前面

create-react-app 是由 React 官方提供并推荐使用构建新的 React 单页面应用程序的最佳方式,不过目前版本(1.5.x)其构建的项目中默认是不支持动态样式语言 Less 的。如果我们的项目必须要使用 Less 呢,这就需要我们手动集成一下。本篇主要针对集成的过程做一个简要记录。

环境准备

本小节先用 create-react-app 构建一个全新的 React 项目作为实验环境。

如果您之前未曾使用过 create-react-app,请先通过如下命令全局安装(假定您本机已经安装了 Node.js):

  1. npm install -g create-react-app

然后,通过如下命令构建一个新的项目my-app

  1. npx create-react-app my-app

通过cd my-app命令进入项目文件夹,执行yarn start命令启动程序,成功运行,则实验环境准备完毕。

最终项目结构:

  1. ├─ node_modules
  2. ├─ public
  3. ├─ src
  4. ├─ .gitignore
  5. ├─ package.json
  6. ├─ README.md
  7. └─ yarn.lock

安装 less & less-loader

要使 create-react-app 构建的项目能正常解析 less 文件,只需要让 webpack 能够把 less 文件编译成 css 文件即可。

所以,首先要把 less 和 less-loader (less 编译器)添加到项目中:

  1. yarn add less less-loader

这样就 OK 了?以上只是在项目中安装了 less 和 less-loader ,但还未曾通过 webpack 使用 less-loader。

至于怎么使用?几种使用方式?请参见 webpack 文档 ,这里不再赘述。

假定您已经仔细阅读过上述 webpack 文档,想必您也清楚我们应该选择在webpack.config.js文件中配置 less-loader。

暴露 webpack 配置文件

突然,您会发现在我们实验项目中找不到 webpack 相关配置文件。

因为脚手架为了实现“零配置”,会默认把一些通用的脚本和配置集成到 react-scripts,目的是让我们专注于src目录下的开发工作,不再操心环境配置。同时,被其集成的脚本和配置也会从程序目录中消失 ,程序目录也会变得干净许多。

如果我们要自定义环境配置怎么办?

项目构建完成后,会提供一个命令yarn eject,通过这个命令,我们可以把被 react-scripts 集成的配置和脚本暴露出来。

以下是脚手架关于yarn eject命令的介绍:

yarn eject

Removes this tool and copies build dependencies, configuration files and scripts into the app directory. If you do this, you can’t go back!

大概意思是,执行该命令后会把已构建依赖项、配置文件和脚本复制到程序目录中。该操作是不可逆转的,执行完成后会删除这个命令,也就是说只能执行一次。

至于 react-scripts 都集成了哪些东西,通过yarn eject命令的执行记录也能看出个大概:

  1. λ yarn eject
  2. yarn run v1.6.0
  3. $ react-scripts eject
  4. ? Are you sure you want to eject? This action is permanent. Yes
  5. Ejecting...
  6. Copying files into E:\React\my-app
  7. Adding \config\env.js to the project
  8. Adding \config\paths.js to the project
  9. Adding \config\polyfills.js to the project
  10. Adding \config\webpack.config.dev.js to the project
  11. Adding \config\webpack.config.prod.js to the project
  12. Adding \config\webpackDevServer.config.js to the project
  13. Adding \config\jest\cssTransform.js to the project
  14. Adding \config\jest\fileTransform.js to the project
  15. Adding \scripts\build.js to the project
  16. Adding \scripts\start.js to the project
  17. Adding \scripts\test.js to the project
  18. Updating the dependencies
  19. Removing react-scripts from dependencies
  20. Adding autoprefixer to dependencies
  21. Adding babel-core to dependencies
  22. Adding babel-eslint to dependencies
  23. Adding babel-jest to dependencies
  24. Adding babel-loader to dependencies
  25. Adding babel-preset-react-app to dependencies
  26. Adding babel-runtime to dependencies
  27. Adding case-sensitive-paths-webpack-plugin to dependencies
  28. Adding chalk to dependencies
  29. Adding css-loader to dependencies
  30. Adding dotenv to dependencies
  31. Adding dotenv-expand to dependencies
  32. Adding eslint to dependencies
  33. Adding eslint-config-react-app to dependencies
  34. Adding eslint-loader to dependencies
  35. Adding eslint-plugin-flowtype to dependencies
  36. Adding eslint-plugin-import to dependencies
  37. Adding eslint-plugin-jsx-a11y to dependencies
  38. Adding eslint-plugin-react to dependencies
  39. Adding extract-text-webpack-plugin to dependencies
  40. Adding file-loader to dependencies
  41. Adding fs-extra to dependencies
  42. Adding html-webpack-plugin to dependencies
  43. Adding jest to dependencies
  44. Adding object-assign to dependencies
  45. Adding postcss-flexbugs-fixes to dependencies
  46. Adding postcss-loader to dependencies
  47. Adding promise to dependencies
  48. Adding raf to dependencies
  49. Adding react-dev-utils to dependencies
  50. Adding resolve to dependencies
  51. Adding style-loader to dependencies
  52. Adding sw-precache-webpack-plugin to dependencies
  53. Adding url-loader to dependencies
  54. Adding webpack to dependencies
  55. Adding webpack-dev-server to dependencies
  56. Adding webpack-manifest-plugin to dependencies
  57. Adding whatwg-fetch to dependencies
  58. Updating the scripts
  59. Replacing "react-scripts start" with "node scripts/start.js"
  60. Replacing "react-scripts build" with "node scripts/build.js"
  61. Replacing "react-scripts test" with "node scripts/test.js"
  62. Configuring package.json
  63. Adding Jest configuration
  64. Adding Babel preset
  65. Adding ESLint configuration
  66. Ejected successfully!
  67. Please consider sharing why you ejected in this survey:
  68. http://goo.gl/forms/Bi6CZjk1EqsdelXk1
  69. Done in 5.37s.

说了这么多,现在怎样才能在我们的项目中暴露 webpack 的配置文件?没错,你没猜错,只需要运行一下yarn eject即可。

再来看我们的实验项目的目录,您会发现其中多了一个config文件夹,其中就有三个关于 webpack 的配置文件:

  1. webpack.config.dev.js # 开发环境配置
  2. webpack.config.prod.js # 生产环境配置
  3. webpackDevServer.config.js # 开发服务器配置

我们需要关注的是前两个,最后一个是关于本地开发服务器http://localhost:3000的一些相关配置。

修改 webpack 配置

理论上讲,需要同步修改 webpack.config.dev.jswebpack.config.prod.js 配置文件:

module.rules节点中找到 css 文件的加载规则:

  1. test: /\.css$/ 修改为 test: /\.(css|less)$/
  2. use数组最后新增一个对象元素{loader: require.resolve('less-loader')}

修改完成后:

  1. // "postcss" loader applies autoprefixer to our CSS.
  2. // "css" loader resolves paths in CSS and adds assets as dependencies.
  3. // "style" loader turns CSS into JS modules that inject <style> tags.
  4. // In production, we use a plugin to extract that CSS to a file, but
  5. // in development "style" loader enables hot editing of CSS.
  6. {
  7. test: /\.(css|less)$/,
  8. use: [
  9. require.resolve('style-loader'),
  10. {
  11. loader: require.resolve('css-loader'),
  12. options: {
  13. importLoaders: 1,
  14. },
  15. },
  16. {
  17. loader: require.resolve('postcss-loader'),
  18. options: {
  19. // Necessary for external CSS imports to work
  20. // https://github.com/facebookincubator/create-react-app/issues/2677
  21. ident: 'postcss',
  22. plugins: () => [
  23. require('postcss-flexbugs-fixes'),
  24. autoprefixer({
  25. browsers: [
  26. '>1%',
  27. 'last 4 versions',
  28. 'Firefox ESR',
  29. 'not ie < 9', // React doesn't support IE8 anyway
  30. ],
  31. flexbox: 'no-2009',
  32. }),
  33. ],
  34. },
  35. },
  36. {
  37. loader: require.resolve('less-loader')
  38. }
  39. ],
  40. },

至此,就已经完成了 create-react-app 对 Less 的支持。

效果验证

最后,在我们的实验项目中验证一下配置是否生效。

首先在src根目录下使用 Less 语法创建一个 less 文件,取名为Test.less

  1. @title-color:#f00;
  2. .App-title {
  3. color: @title-color
  4. }

然后在App.js文件中通过如下API导入上述的 less 文件:

  1. import './Test.less';

再次yarn start运行我们的程序,如果标题Welcome to React变成红色则说明配置没有问题。

如何解决 React 官方脚手架不支持 Less 的问题的更多相关文章

  1. React官方脚手架不支持less问题解决

    create-react-app是由React官方提供,并推荐构建React单页应用程序的最佳方法,但是默认不支持less,需要手动集成: 1,必须手动安装less npm install less ...

  2. React 官方脚手架 create-react-app快速生成新项目

    进入新公司已经半年了,各个业务线,技术栈都已经熟悉,工作也已经游刃有余,决定慢下脚步,沉淀积累,回顾一下所用技术栈所包含的基本知识,以及再公司中的实战. 首先回顾新项目搭建 react脚手架目前使用较 ...

  3. react官方脚手架搭建项目

    1.全局安装 npm install -g create-react-app 2. app后面还要给项目文件命名 create-react-app //是全局命令来创建react项目 3.然后按照提示 ...

  4. 关于react 官方脚手架使用出现的问题

    首先按照官网说明,一路的安装下来,很顺利,然后开始运行吧,提示个错误,缺少index.js 文件  原来是默认给出的文件是App.js 如何更改呢 找到react-script模块文件夹config下 ...

  5. react官方脚手架添加less配置

    装两个包 npm install --save less less-loader 在node-modules/react-scripts/config/webpack.config.js中 在大概58 ...

  6. React/VUE 脚手架2.0和3.0

    react官方脚手架 npm install -g create-react-app create-react-app my-app cd my-app npm start 区别自己对比 vue2.x ...

  7. 自制的React同构脚手架

    代码地址如下:http://www.demodashi.com/demo/12575.html Web前端世界日新月异变化太快,为了让自己跟上节奏不掉队,总结出了自己的一套React脚手架,方便日后新 ...

  8. 从 React 原理来看 ahooks 是怎么解决 React 的闭包问题的?

    本文是深入浅出 ahooks 源码系列文章的第三篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本文来探索一下 ahooks 是怎么解决 React 的闭包问题的 ...

  9. 关于React的脚手架

    Rewire你的应用 https://ant.design/docs/react/use-with-create-react-app-cn create-react-app (官方脚手架 简称cra) ...

随机推荐

  1. 使用纳米 Protocol buffers 作为序列化数据

    使用纳米 Protocol buffers 作为序列化数据 Protocol Buffers 是 Google 公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化. 但是它更小, 更快, ...

  2. python 开发环境部署

    pip 通过google搜索到,2019.4月的版本是19. 需要更换源,否则会挺慢. Windows下更换pip源为清华源 打开appdata文件夹,在资源管理器的地址栏输入%appdata%后回车 ...

  3. 接口自动化框架(java)--2.接口用例POST请求,参数配置

    这套框架的报告是自己封装的 Post类型的接口通常有请求参数,请求参数也是json类型,所以需要写一个类将请求参数序列化成json对象 以常见的登录接口为例 新建一个package,和postPara ...

  4. C语言中格式字符串

    C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项. 一.类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示: 字符  ...

  5. C#中方法、类等的默认访问修饰符~

    C# 方法默认访问级别 : private C# 类默认访问级别 : internal 1.命名空间下的元素的默认访问修饰符 public : 同一程序集的其他任何代码或引用该程序集的其他程序集都可以 ...

  6. HashMap 源码分析

    static final int DEFAULT_INITIAL_CAPACITY = 16;  默认容量 static final int MAXIMUM_CAPACITY = 1073741824 ...

  7. 开发宏功能:excel中从sheet批量插入

    源数据如图: 宏操作: 生成数据后: 关键操作:在excel中启用开发工具,添加宏,然后添加模块即可,编辑完代码后,自定义功能按钮即可. Sub MakeDataSource() Dim isExis ...

  8. C#中的as关键字

    你能进到这篇文章…… 首先你可能明白类似于 double num=0;int m=(int) num; 或者你明白 int m=209;String str=m.toString();或者说你甚至见过 ...

  9. python反反爬,爬取猫眼评分

    python反反爬,爬取猫眼评分.解决网站爬取时,内容类似:$#x12E0;样式,且每次字体文件变化.下载FontCreator . 用FontCreator打开base.woff.查看对应字体关系 ...

  10. socket的原理和实验

    1.socket原理 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认. (1)服务器监听:是服务器端套接字并不定位具体的客户端套接 ...