上一篇文章 体验了webpack的打包过程,其中js文件不需要我们手动配置就可以成功解析,可其它类型的文件,比如css、less呢?

css-loader

首先,创建一个空文件夹,通过 npm init -y 初始化项目,项目结构如下

demo
├─ src
│ ├─ css
│ │ └─ index.css
│ ├─ js
│ │ └─ component.js
│ └─ index.js
├─ index.html
└─ package.json

在component.js 中创建一个div元素并设置class,index.css 中 定义样式,最后在 index.js 中引入 component.js 及 index.css 文件

// component.js
const divEl = document.createElement("div");
const text = document.createTextNode("hello webpack");
divEl.appendChild(text);
divEl.setAttribute("class", "element");
document.body.appendChild(divEl); // index.css
.element {
  font-size: 20px;
  font-weight: bold;
} // index.js
import "./js/component";
import "./css/index.css";

在package.json 中配置 build 指令后,使用 npm run build 运行项目

但此时是不能被编译通过,它报错提示“You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file.”

用于处理css资源的loader是css-loader。npm i css-loader -D 在项目中安装后,在项目根目录新建 webpack.config.js 文件,在 module 对象中 rules 里配置,test 通过正则表达式匹配文件后缀,use 表示使用的 loader。

const path = require("path");
module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["css-loader"],
      },
    ],
  },
};

再次 npm run build 运行项目,此时已经可以编译通过了~

index.html 引入打包后的 bundle.js,通过 Live Server 运行 html 文件

style-loader

可以在html页面中看到 div 标签,但 css 没有生效,这是因为 css-loader 只负责解析 css,但不会将 css 插入到页面中,这个操作需要 style-loader 来完成。

通过 npm i style-loader -D 安装后,在 webpack.config.js 中配置。

对于 css 文件,需要先通过 css-loader 解析后再通过 style-loader 插入页面。而 loader 的执行顺序是从后往前,所以 style-loader 放在 css-loader 前面。

module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
    ],
  },

此时 css 文件中的样式就可以生效啦,可以看到 style-loader 的作用就是创建了一个 style 标签,并将 css-loader 解析完的 css 内容插入

less-loader

在 css 文件夹下增加一个 index.less 文件,在 index.js 中引入

// index.less
@color: red; .element {
  color: @color;
} // index.js
import "./css/index.less";

运行后同样会提示没有合适的loader

处理 less文件使用 less-loader,但实际上 less-loader 需要借助 less 这个工具,直接通过 less 工具就可以将 less 文件里的代码处理为浏览器可识别的 css 代码

执行 npx less ./src/css/index.less > ./src/css/revert.css 命令使用 less 工具将 index.less 文件解析成 revert.css

在webpack.config.js中只需要将 less-loader 配置上就行,less-loader 需要最先将 less 资源处理成 css ,所以放置最后面

 module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.less$/,
        use: ["style-loader", "css-loader", "less-loader"],
      },
    ],
  },

重新编译后就可以浏览器上看到less设置的样式生效啦,以及 css 和 less 分别使用 style-loader 创建了两个 style 标签。

PostCSS

PostCSS是一个通过JavaScript来转换样式的工具,帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置,但是PostCSS不能直接实现,需要借助对应的插件。

比如以下css代码,某些浏览器可能不兼容,自己手动添加浏览器前缀使之兼容也可以,但太过麻烦,而且也不知道需要兼容哪些版本的浏览器,使用工具是比较好的方案。

.content {
  user-select: none;
  color: #12345678;
  transition: all 2s ease;
}

通过 postcss-cli 可以对文件进行解析处理,通过指令 npx postcss -o result.css ./src/css/component.css 进行编译

虽然编译没有报错,但是编译后并没有对文件进行兼容处理,因为没有指定插件,分别指定两种插件,来看看编译结果

npx postcss --use autoprefixer -o autoprefixer.css ./src/css/component.css
npx postcss --use postcss-preset-env -o preset.css ./src/css/component.css

autoprefixer 只负责增加浏览器前缀

postcss-preset-env css做转换,如16进制颜色转换成rgb,并且内置了autoprefixer

postcss-loader

在webpack环境下,使用postcss-loader来对css进行兼容性的处理,同时需要配置插件, autoprefixer 和 postcss-preset-env 都可以。

{
test: /\.css$/,
use: [
"style-loader",
"css-loader",
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [require("postcss-preset-env")],
},
},
},
],
},

添加前缀和样式转换后的代码就可以被添加到浏览器中

browsersList

通过postcss对css代码兼容性进行了处理,但我们可以看到上面定义了css3中的属性 transition,某些浏览器有可能存在兼容性问题,但在这里没有添加浏览器前缀。

这是因为没有指定浏览器兼容版本,对于编译支持的浏览器版本采取了默认配置,默认配置中的浏览器已经都能够支持 transition 属性。

我们可以通过 browsersList 来指定浏览器兼容性版本,可配置在 package.json 或者 .browserslistrc 文件中

> 0.1%,
last 4 version,
not dead

.browserslistrc 文件配置表示浏览器使用率大于0.1%,每个浏览器的最后四个版本、以及没有“死亡”的浏览器,扩大了需要兼容的浏览器版本。

此时编译后的代码就会帮我们添加浏览器前缀。

webpack处理样式资源,通过 css-loader、style-loader 解析 css 语法browsersList、postcss 方式,处理兼容性问题。

以上是和样式资源有关的编译配置,更多有关webpack的内容可以参考我其它的博文,持续更新中~

webpack是如何处理css/less资源的呢的更多相关文章

  1. Webpack干货系列 | 怎么运用 Webpack 5 处理css/scss/sass、less、stylus样式资源

    程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解webpack 5 如何高效处理CSS 资源.scss/sass 资源.l ...

  2. NanUI文档 - 打包并使用内嵌式的HTML/CSS/JS资源

    NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript相互掉用(待更新...) 如何处理Nan ...

  3. Webpack 2 视频教程 012 - 理解Webpack 中的 CSS 作用域与 CSS Modules

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  4. vue webpack 打包后css背景图路径问题

    最近在写vue-webpack项目时,打包后遇到了css背景图片路径报错的问题 奇怪的是,通过img标签引入的图片路径却没有问题,看来是webpack在打包后,读取css中图片的相对路径出错了. 稍微 ...

  5. webpack快速入门——CSS进阶:自动处理CSS3前缀

    为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀.目的就是让我们写的页面在每个浏览器中都可以顺利运行. 1.安装 cnpm i postcss-loader aut ...

  6. webpack快速入门——CSS文件打包

    1.在src下新建css文件,在css文件下新建index.css文件,输入以下代码 body{ background:pink; color:yellowgreen; } 2.css建立好后,需要引 ...

  7. webpack快速入门——CSS中的图片处理

    1.首先在网上随便找一张图片,在src下新建images文件夹,将图片放在文件夹内 2.在index.html中写入代码:<div id="pic"></div& ...

  8. webpack快速入门——CSS分离与图片路径处理

    1.在终端安装extract-text-webpack-plugin 2.引入插件 const extractTextPlugin = require("extract-text-webpa ...

  9. webpack快速入门——CSS进阶,Less文件的打包和分离

    1.要使用less,首先使用npm安装less服务 cnpm install less --save-dev 还需要安装Less-loader用来打包使用. cnpm install less-loa ...

  10. webpack快速入门——CSS进阶:SASS文件的打包和分离

    1.安裝:因为sass-loader依赖于node-sass,所以需要先安装node-sass cnpm install node-sass --save-dev cnpm install sass- ...

随机推荐

  1. 2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,

    2021-08-19:超级洗衣机.假设有 n 台超级洗衣机放在同一排上.开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的.在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机, ...

  2. vue全家桶进阶之路4:NPM包

    NPM(Node Package Manager)是 Node.js 的包管理工具,用来安装各种 Node.js 的扩展. NPM是 JavaScript 的包管理工具,也是世界上最大的软件注册表.有 ...

  3. ModuleNotFoundError: No module named 'flask_mail'

    ModuleNotFoundError: No module named 'flask_mail' 解决: pip install flask_mail

  4. jmeter跨线程组引用变量的3种方法

    利用BeanShell后置处理程序将参数设置为全局变量,用于跨线程传参(注:1.把提取变量的线程组放到引用变量的线程组前2.在测试计划中勾选"独立运行每个线程组") 方法1(jme ...

  5. Python基础 - python解释器

    Python解释器是什么 Python解释器本身也是个程序, 它是解释执行 Python代码的,所以叫解释器. 没有它,我们的Python代码是没有办法运行的. 怎么下载安装Python解释器   官 ...

  6. java中单例模式 如何使用

    引用: 原文链接:https://blog.csdn.net/qq_41458550/article/details/109243456

  7. Windows/Linux 下功能强大的桌面截图软件

    说到桌面截图软件,很多人首先想到的是 QQ 自带的截图,或者更高级功能更强大的 Snipaste 截图工具. 独立版本的 QQ 截图至少我目前没找到官方正式的下载链接,默认需要安装和打开 QQ 才能使 ...

  8. NLM 公布了一个新的重新设计的 PubMed 数据库

    经常使用 PubMed 的童鞋可能已经发现,美国国家医学图书馆(NLM)在今年 10 月份左右发布了一个新的重新设计的版本以取代 PubMed 数据库的现有版本,新版本现在已经上线,可以通过下面的链接 ...

  9. mysql_三大范式

    介绍 数据库的三大范式就是数据库的表应该如何设计,应该注意什么. 第一范式 要求每一张表都有一个主键,每一个字段都不可再分. 举例: id username address 1 张三 中国,北京 2 ...

  10. 前端仿新浪新闻 tabs 选项卡tabs标签页,根据文字多少自适应 tab项宽度

    前端仿新浪新闻 tabs 选项卡tabs标签页,根据文字多少自适应 tab项宽度, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?i ...