从零搭建项目(3) --- 前端: 使用Sass和Antd

我的博客地址

正式地址
测试地址
前端源码
后端源码

文章目录

  1. 项目及其技术栈介绍
  2. 前端: 项目初始化
  3. 前端: 使用Sass和Antd
  4. 前端: 开发体验优化
  5. 前端: 搭建路由和状态管理
  6. 前端: 支持Axios
  7. 前端: 打包与环境变量设置
  8. 前端: 团队代码规范
  9. 后端: 项目初始化和使用Koa相关
  10. 后端: 使用TypeORM和MySQL
  11. 部署: 使用nginx部署前端项目
  12. 部署: 后端部署
  13. 部署: 使用jenkins自动化部署

前言

该篇博客主要介绍如何在项目中使用Sass和Antd,有用到的知识点如下:

  1. 支持sass
  2. 支持css-module
  3. 支持公共样式
  4. antd及其按需加载

支持sass

  • 什么是sass
    sass是一款css预处理语言,支持变量,嵌套,mixin和导入等功能,可以极大地方便和简化css写法。

  • 支持sass

    1. 要使用sass的语法,我们不单单要安装sass-loadernode-sass,还需要安装style-loader以及css-loader
      npm i -D sass-loader node-sass style-loader css-loader
      另外在国内装不下node-sass或者装得慢的同学可以在根目录下新建.npmrc,在里面添加如下代码使用淘宝源进行安装,或者直接使用nrm切换到淘宝源安装

      image.png

    2. 安装完成后,我们在build/rules下新建styleRules.js文件,并编写相关配置:

      image.png

      之后在webpack.config.js中进行引用:
      image.png

      这里有一点需要注意的是,webpack调用这三个loader的顺序是从右到左的,也就是上图的从下到上,其中:
      sass-loader: 将 Sass 编译成 CSS,默认使用 Node Sass
      css-loader: 将 CSS 转化成 CommonJS 模块
      style-loader: 将 JS 字符串生成为 style 节点

    3. 然后src下新建一个index.scss,随便写入一个样式,在index.tsx中使用:

      image.png

      image.png

    4. 这时候就可以使用sass来进行样式编写了


      image.png

支持css-module

  • 什么是css-module
    css-module是CSS模块化的一种方案,为的就是解决css类名冲突问题,同等的方案还有BEM规范

  • 支持css-module

    1. 要支持css-module非常简单,只要在前面的styleRules.js文件中,针对css-loader做一个配置即可:

      image.png

    2. 然后在src/index.tsx中将scss文件的引入和使用方式改成如下:

      image.png

      这时候我们就可以查看效果了,可以看到test变成了一串自动生成的hash码:
      image.png

      当然也有小伙伴可能会说,变成了这一串hash那我怎么知道这个元素是哪个组件的呢?我们把配置改成如下即可:
      image.png

      可以看到类名中加上了原本的类名:
      image.png

    3. 在前面配置和使用中,虽然已经可以正常使用,但是index.tsx出现了一个错误,说找不到index.scss文件

      image.png

      原因是ts不认识这个scss文件,所以这时候需要编写对应的类型文件.d.ts
      我们在src下新建types文件夹,并新建typed-css-modules.d.ts文件,在里面定义scss模块内容:
      image.png

      这时候引用scss文件就不会再报错了,但同时存在一个问题,styles的类型是any:
      image.png

    4. 要添加对styles的类型定义,我们当然可以自己新建一个index.scss.d.ts文件在里面自己写一个interface来定义,但是这样未免太过于麻烦,所以这时候我们可以使用css-modules-typescript-loader这个库来帮助我们定义,首先需要安装它npm i -D css-modules-typescript-loader,然后在styleRules.js中加上他:

      image.png

      在编写或改动了scss文件后, 它会自动生成index.scss.d.ts文件:
      image.png

支持公共样式

在支持了sass之后,我们可以在样式代码的编写中使用变量,而有些变量可以放置在公共的样式文件中,使用的时候直接引用即可。
我们在src下新建styles文件夹,然后新建base.scss文件,在里面写入一个变量:

image.png

之后我们在index.scss文件中引用这个变量:
image.png

这时候还需要在styleRules.js中,将公共样式文件夹的路径添加进去,否则sass-loader不会去编译这些文件,这里需要注意的是,这里使用的是sass-loader@7.3.1,而在最新的8.0.0版本不能直接在options中写includePaths,而需要在sassOptions中写,之前的版本则可以直接写includePaths,另外8.0.0版本和下一章会说到的thread-loader配合起来会报错,所以现在先不要用8.0.0版本:
image.png

这是我们可以看到效果依旧正确


image.png

antd及其按需加载

React技术栈中,很多人都会使用antd作为自己项目的UI库,本博客也不例外,将antd集成了进去。

  • 需要安装antd
    npm i -S antd

  • antd按需加载
    然后因为在第二章中安装了babel-plugin-import,所以我们可以直接用按需加载的方式使用antd的组件:

    image.png

    但是你会发现这样引入的组件缺少样式
    image.png

    这时候我们需要在jsRules.js文件中添加对应的配置:
    image.png

    另外,因为antd的样式使用的是less编写而成,所以我们需要额外安装lessless-loader
    npm i -D less less-loader
    然后在styleRules.js中添加对less文件的支持,注意less-loader4.0以后的版本在这里的javascriptEnabled一定要为true,否则因为无法开启js编译而导致报错:
    image.png

    最后回到页面中会发现样式引入也ok了:
    image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容