当前位置: 首页 > news >正文

前端基础之《React(5)—webpack简介-集成CSS和SASS支持》

接上篇......

十三、集成CSS和SASS支持

1、建一个css文件
assets/app.css

html, body {padding: 0;margin: 0;background-color: #f5f5f5;
}

2、安装loader(先处理CSS文件)

cnpm i style-loader -D
cnpm i css-loader -D

3、配置module.rules
修改config.js

// 两个环境都需要的公共配置// 从node进程中引入path模块
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { ProgressPlugin, ProvidePlugin } = require('webpack') // webpack自带插件module.exports = {entry: {// 把第三方库打包到vendors.js中,从业务代码中抽离出来,为了以后部署时做CDN优化vendors: ['react', 'react-dom/client'],// 可以给入口文件取个名字,给output使用app: {// 用import引入main.js作为入口文件import: path.resolve(__dirname, '../', 'src/main.js'),dependOn: 'vendors' // 用dependOn指定业务代码app依赖于vendors,先打包vendors,再打包app}},// 出口output: {// 自定义打包结果的输出目录,默认是dist目录,这里只能使用绝对路径path: path.resolve(__dirname, '../', 'dist'),// 指定打包结果的JS名称规范// filename: 'bundle.js' // 量词,一捆、一束filename: 'js/[name].[chunkhash:8].js',// 每次build打包时,都自动先删除dist中的旧文件clean: true},// 插件// 所有webpack插件都是class,用的时候需要newplugins: [// 用于把JS脚本和index.html自动注入合并new HtmlWebpackPlugin({template: path.resolve(__dirname, '../', 'public/index.html'),inject: 'body', // 把JS注入到body结束标签前面filename: 'index.html', // 指定打包成功后这个模板叫什么名字title: '测试'}),// 添加编译进度条new ProgressPlugin({handler(percentage, message, ...args) {console.log(percentage, message, ...args)}}),// 从node_modules中加载react包,将其放在全局变量React中,这样之后所有的文件模块都可以直接访问new ProvidePlugin({React: 'react'}),],// 在webpack眼中一切文件皆模块,webpack必须使用各种loaders来处理各种不同的模块文件module: {// 定义模块编译的规则和方式rules: [{test: /\.(js|jsx|ts|tsx)$/, // 检测模块以js结尾use: ['babel-loader'], // 使用babel编译器把ES6+的代码编译成ES5exclude: /node_modules/, // 排除node_modules目录下的第三方包文件},{test: /\.(css)$/,use: ['style-loader', 'css-loader'], // 多个loader从右向左执行exclude: /node_modules/,}]}
}

{
test: /\.(css)$/,
use: ['style-loader', 'css-loader'], // 从右向左执行
exclude: /node_modules/,
}

webpack工作时,遇到以.css结尾的模块时,先用css-loader加载并解析返回css代码,接着由style-loader把css代码插入到head标签中

4、把项目运行起来查看

5、打包把CSS抽离出来
把配置从config.js中移出来

修改serve.js

// 只有开发环境才需要用到配置
module.exports = {mode: 'development',devtool: 'inline-source-map',// 本地服务配置devServer: {port: 8000},module: {rules: [{test: /\.(css)$/,use: ['style-loader', 'css-loader'], // 从右向左执行exclude: /node_modules/,}]}
}

修改build.js

// 只有打包时才用到配置
module.exports = {mode: 'production',devtool: 'source-map',module: {rules: [{test: /\.(css)$/,use: ['style-loader', 'css-loader'], // 从右向左执行exclude: /node_modules/,}]}
}

安装插件:

cnpm i mini-css-extract-plugin -D

修改build.js

// 只有打包时才用到配置
const MiniCssExtractPlugin = require("mini-css-extract-plugin");module.exports = {mode: 'production',devtool: 'source-map',plugins: [new MiniCssExtractPlugin()],module: {rules: [{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, "css-loader"],exclude: /node_modules/},]}
}

这样子的话,起本地服务,css包含在app中。build打包,css会分离出来

6、为MiniCssExtractPlugin插件增加选项
修改build.js

// 只有打包时才用到配置
const MiniCssExtractPlugin = require("mini-css-extract-plugin");module.exports = {mode: 'production',devtool: 'source-map',plugins: [new MiniCssExtractPlugin({filename: 'css/[name].[contenthash:8].css',})],module: {rules: [{test: /\.css$/i,use: [MiniCssExtractPlugin.loader, "css-loader"],exclude: /node_modules/},]}
}

css文件放入单独的目录,解决浏览器缓存刷新问题

7、集成SASS

cnpm i sass-loader sass -D

修改serve.js

// 只有开发环境才需要用到配置
module.exports = {mode: 'development',devtool: 'inline-source-map',// 本地服务配置devServer: {port: 8000},module: {rules: [{test: /\.(css|scss)$/i,use: ['style-loader', 'css-loader', 'sass-loader'], // 从右向左执行exclude: /node_modules/,}]}
}

修改build.js

// 只有打包时才用到配置
const MiniCssExtractPlugin = require("mini-css-extract-plugin");module.exports = {mode: 'production',devtool: 'source-map',plugins: [new MiniCssExtractPlugin({filename: 'css/[name].[contenthash:8].css',})],module: {rules: [{test: /\.(css|scss)$/i,use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],exclude: /node_modules/}]}
}

修改app.css,改名app.scss

$c: blue;html, body {padding: 0;margin: 0;background-color: #f5f5f5;color: $c;
}

遇到以.scss结尾的模块时,先使用sass-loader加载模块,并交给sass编译器进行编译,编译结果得到css模块,再使用css-loader

注意:当处理一种文件模块,需要多个loaders时,先工作的loader放在数组的后面

http://www.dtcms.com/a/544439.html

相关文章:

  • 国外手机网站源码邵阳 做网站公司
  • 机器学习(3)---线性算法,决策树,神经网络,支持向量机
  • 网站建设服务费属于什么科目中山 灯饰 骏域网站建设专家
  • 操作系统(9)虚拟内存-内存映射
  • 30. 文件IO (1)
  • 技术深析:衡石 Agentic BI 的架构革命与核心技术突破
  • UVa 12333 Revenge of Fibonacci
  • rank(A+E) >= rank(A)证明
  • 未来之窗昭和仙君(四十三)开发布草管理系统修仙版——东方仙盟筑基期
  • VMware 虚拟机网络故障
  • 河南省建设厅举报网站建网站需要多少资金
  • 网站开发常用的谷歌插件企业首次建设网站的策划流程
  • 计算机3D视觉:Pytorch3d的环境配置与初步使用
  • 国产化转型实战:制造业供应链物流系统从MongoDB至金仓数据库迁移全指南
  • 从零开始学 Rust:环境搭建、基础语法到实战项目全流程
  • S11e Protocol 完整白皮书
  • CUDA:通往大规模并行计算的桥梁
  • AR智能眼镜:变电站巡检误操作的“电子安全员”
  • Rust 中的内存对齐与缓存友好设计:性能优化的隐秘战场
  • Springboot3+mqttV5集成(Emqx 5.8.3版本)
  • 东莞网站建设设技术支持网站
  • 高州网站建设公司欧洲vodafonewifi18mmpcc
  • 第二章、Docker+Ollama封神!2步装Qwen+Deepseek小型模型
  • Rust——Trait 定义与实现:从抽象到实践的深度解析
  • Spring AI加DeepSeek实现一个Prompt聊天机器人
  • 怎么判断我的电脑是否支持PCIe 5.0 SSD?Kingston FURY Renegade G5
  • Kotlin Map扩展函数使用指南
  • 批量地址解析坐标,支持WPS、EXCEL软件,支持导出SHP、GEOJSON、DXF等文件格式
  • 【Docker】【2.docker 安装 ubuntu 桌面版】
  • 单片机上的动态数码管