在一个简单的webpack.config.js中,构建了一个基础的webpack.config.js文件,但是只支持js模块的打包。

本篇中添加对css和img的模块化支持

首先需要安装三个个loader css-loader, style-loader,file-loader

yarn add css-loader style-loader

css-loader用于对css文件的解析,style-loader会将解析的css样式以style标签的形式插入到html文件中

安装好之后,需要修改webpack.config.js配置模块,

在之前的webpack的配置文件基础上,新加上module属性, 里面的style-loader需要在css-loader之前

  1. module: {
  2. rules: [
  3. {
  4. test: /\.css$/,
  5. use: [
  6. 'style-loader',
  7. 'css-loader'
  8. ]
  9. }
  10. ]
  11. }

rules属性则是匹配请求的Rule(规则)数组,数组每一项Rule对象都可用于匹配某一类型的模块。

用于匹配css模块的Rule,里面包含了两个属性testuse,

test一般是一个正则表达式,用于匹配需要解析的模块文件, use数组则一般指定使用哪些loader,里面每一项可以是字符串或者是对象

  1. use:[
  2. 'style-loader'
  3. ]
  4. // 等同于
  5. use: [
  6. {
  7. loader: 'style-loader'
  8. }
  9. ]

这里还可以使用postcss-loader插件为css属性添加浏览器前缀

在完成配置文件和依赖安装后,在src文件目录下新建style.css

  1. .red{
  2. color: red;
  3. }

同时在index.js文件中引入该css文件,

  1. import _ from 'lodash'
  2. import './style.css'
  3. function createComponent(tag) {
  4. let element = document.createElement(tag)
  5. element.innerHTML = _.join(['Hello', 'webpack'], ', ')
  6. element.classList.add('red')
  7. return element
  8. }
  9. document.body.append(createComponent('div'))

之后执行打包指令, 然后打开dist目录下的index.html文件就会看到文字颜色已经是红色,同时在head标签里多了一个style标签,里面就是style.css里面的样式

同理可以通过file-loader处理图片资源,在配置文件中添加图片文件的匹配

  1. module: {
  2. rules: [
  3. {
  4. test: /\.css$/,
  5. use: [
  6. 'style-loader',
  7. 'css-loader'
  8. ]
  9. },
  10. {
  11. test: /\.(jpg|jpeg|png|bmp)$/,
  12. use: [
  13. {
  14. loader: 'file-loader',
  15. options: {
  16. name: 'img/[name].[ext]'
  17. }
  18. }
  19. ]
  20. }
  21. ]
  22. }

在这个Rule.use规则中,通过options.name属性将图片文件打包到dist/img目录下,[name].[ext]占位符,让打包后的文件使用原来的文件名和后缀,

之后在index.js中引入一个图片

  1. import _ from 'lodash'
  2. import './style.css'
  3. import ImgFile from './asset/tim.jpg'
  4. function createComponent(tag) {
  5. let element = document.createElement(tag)
  6. element.innerHTML = _.join(['Hello', 'webpack'], ', ')
  7. element.classList.add('red')
  8. let img = new Image()
  9. img.src = ImgFile
  10. element.append(img)
  11. return element
  12. }
  13. document.body.append(createComponent('div'))

接着执行打包指令,就会看到dist目录下多了一个img文件夹,里面就是我们引入的图片。打开index.html就会看到图片



至此,就已经完成了对css和img的引入。但是当前的样式文件是以style标签的形式插入到html中的。

但是我们想要的是把css文件抽离出来一个单独的css文件

那么就需要plugin了,这里使用官方推荐的 **MiniCssExtractPlugin **插件,这个插件需要额外安装,

在上一篇中,index.html是手动创建的,这里可以使用 **HtmlWebpackPlugin **自动我们自动创建html文件,同时webpack还会在html里面自动添加css和script的外链,

这样就不用手动的引入css和js文件了。

安装 两个插件yarn add mini-css-extract-plugin html-webpack-plugin,

安装完成后需要在config文件顶部引入两个插件,然后在文件中添加 plugins 属性数组,在数组里通过new方式配置,

同时将之前的style-loader替换成MIniCssExtractPlugin提供的loader

  1. const path = require('path')
  2. const HtmlWebpackPlugin = require('html-webpack-plugin')
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  4. module.exports = {
  5. ...
  6. module: {
  7. ...
  8. {
  9. test: /\.css$/,
  10. use: [
  11. MiniCssExtractPlugin.loader, // 将'style-loader'替换成MIniCssExtractPlugin.loader
  12. 'css-loader'
  13. ]
  14. },
  15. ...
  16. },
  17. plugins: [
  18. new HtmlWebpackPlugin(),
  19. new MiniCssExtractPlugin({
  20. filename: 'css/style.css'
  21. })
  22. ]
  23. }

这里还需要一个CleanWebpackPlugin插件清空dist文件夹,这样每次打包都不用手动删除旧的文件

  1. const { CleanWebpackPlugin } = require('clean-webpack-plugin') // 新的CleanWebpackPlugin 引入方式,旧的已不可用

之后删除dist文件夹,执行打包,就会看到新打包的文件,自动创建的index.html文件

完整的webpack.config.js文件

  1. const path = require('path')
  2. const HtmlWebpackPlugin = require('html-webpack-plugin')
  3. const MiniCssExtractPlugin = require('mini-css-extract-plugin')
  4. const { CleanWebpackPlugin } = require('clean-webpack-plugin')
  5. module.exports = {
  6. entry: {
  7. app: path.resolve(__dirname, './src/index.js')
  8. },
  9. output: {
  10. filename: 'bundle.js',
  11. path: path.resolve(__dirname, 'dist')
  12. },
  13. module: {
  14. rules: [
  15. {
  16. test: /\.css$/,
  17. use: [
  18. MiniCssExtractPlugin.loader,
  19. 'css-loader'
  20. ]
  21. },
  22. {
  23. test: /\.(jpg|jpeg|png|bmp)$/,
  24. use: [
  25. {
  26. loader: 'file-loader',
  27. options: {
  28. name: 'img/[name].[ext]'
  29. }
  30. }
  31. ]
  32. }
  33. ]
  34. },
  35. plugins: [
  36. new HtmlWebpackPlugin(),
  37. new MiniCssExtractPlugin({
  38. filename: 'css/style.css'
  39. }),
  40. new CleanWebpackPlugin()
  41. ]
  42. }

从0构建webpack开发环境(二) 添加css,img的模块化支持的更多相关文章

  1. 从0构建webpack开发环境(一) 一个简单webpack.config.js

    本文基于webpack4.X,使用的包管理工具是yarn 概念相关就不搬运了,直接开始 首先项目初始化 mkdir webpack-demo && cd webpack-demo ya ...

  2. 从0构建webpack开发环境(三) 开发环境以及 webpack-dev-server 的使用

    sourceMap 实际应用开发过程中大部分时间都是处于开发模式中,其中需要频繁的修改代码.调试和打包. 但是打包后的代码多个模块压缩到了一个bundle文件,如果出现警告或者异常很难定位到具体模块和 ...

  3. vue2.0 + npm + webpack 开发===环境配置

     cnpm安装:npm install -g cnpm --registry=http://registry.npm.taobao.org 1.安装vue-cli脚手架构建工具cnpm install ...

  4. Python学习1:使用Aptana构建Python开发环境

    使用Aptana构建Python开发环境 下载Aptana: http://www.aptana.com/products/studio3/download http://www.newasp.net ...

  5. Python黑帽编程1.2 基于VS Code构建Python开发环境

    Python黑帽编程1.2  基于VS Code构建Python开发环境 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...

  6. Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解

    作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...

  7. 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境

    转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...

  8. Vagrant 构建 Linux 开发环境

    Vagrant 是一个简单易用的部署工具,用英文说应该是 Orchestration Tool .它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境, Vagrant 基于 Ruby 开 ...

  9. 使用create-react-app 快速构建 React 开发环境以及react-router 4.x路由配置

    create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境. create-react-app 自动创建的项目是基于 Webpack + E ...

随机推荐

  1. man DMIDECODE

    DMIDECODE(8)                                                      DMIDECODE(8) NAME/名称       dmideco ...

  2. ChainMap简单示例

    ChainMap是dict的子类,拥有dict的所有功能, 感觉用它的地方吧??? from collections import ChainMap """ 相当于joi ...

  3. php stristr()函数 语法

    php stristr()函数 语法 作用:返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写.直线电机厂家怎么样? 语法:stristr(string,search,before_s ...

  4. 【HDOJ6656】Kejin Player(期望DP)

    题意:玩一个共有n级的游戏,i级出发每次可以花a[i]的代价,有p[i]的几率变成i+1级,有1-p[i]的几率变成x[i]级,x[i]<=i 多次询问,每次询问从l级升到r级的期望总代价 n, ...

  5. [CSP-S模拟测试]:旋转子段(数学)

    题目描述 $ZYL$有$N$张牌编号分别为$1,2,...,N$.他把这$N$张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第$i$个位置的牌的编号为$i$,我们就称之为固定点.旋 ...

  6. Yii 1.1 常规框架部署和配置

    <?php //index.php //入口文件配置操作 // change the following paths if necessary $yii=dirname(__FILE__).'/ ...

  7. data_model_action

    w PowerDesigner

  8. ImportError: libsybdb.so.5: cannot open shared object file: No such file or directory pymssql linux 问题解决 搭建驱动

    [root@hadoop1 nlp]# python sqlserver_t.py Traceback (most recent call last):  File "sqlserver_t ...

  9. Gradle查看Project中的所有 Task

    查看Project中所有的Task:$ gradle tasks 查看Project中所有的properties:$ gradle properties 如: 参照了: https://www.jia ...

  10. ag-grid 表格中添加图片

    ag-grid是一种非常好用的表格,网上搜索会有各种各样的基本用法,不过对于在ag-grid 表格中添加图片我没有找到方法,看了官方的文档,当然英文的自己也是靠网页翻译,最后发现有这么一个例子,我知道 ...