webpack4 SCSS提取和懒加载的示例


Posted in Javascript onSeptember 03, 2018

本节课讲解在webpack v4中的 SCSS 提取和懒加载。值得一提的是,v4v3在 Scss 的懒加载上的处理方法有着巨大差别。

本节课主要涉及 SCSS 在懒加载下提取的相关配置和插件使用。

下图展示了这次的目录代码结构:

webpack4 SCSS提取和懒加载的示例

为了实现 SCSS 懒加载,我们使用了extract-text-webpack-plugin插件。

需要注意,在安装插件的时候,应该安装针对v4版本的extract-text-webpack-plugin。npm 运行如下命令:npm install --save-dev extract-text-webpack-plugin@next

其余配置,与第六课相似。package.json配置如下:

{
 "devDependencies": {
 "css-loader": "^1.0.0",
 "extract-text-webpack-plugin": "^4.0.0-beta.0",
 "node-sass": "^4.9.2",
 "sass-loader": "^7.0.3",
 "style-loader": "^0.21.0",
 "webpack": "^4.16.0"
 }
}

关于我们的 scss 文件下的样式文件,base.scss:

// 网站默认背景色:red
$bgColor: red !default;
*,
body {
 margin: 0;
 padding: 0;
}
html {
 background-color: $bgColor;
}

common.scss:

// 覆盖原来颜色:green
html {
 background-color: green !important;
}

2. 使用ExtractTextPlugin

使用extract-text-webpack-plugin,需要在webpack.config.jsplugins选项和rulesscss的相关选项进行配置。

webpack.config.js:

const path = require("path");
const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
 entry: {
 app: "./src/app.js"
 },
 output: {
 publicPath: __dirname + "/dist/",
 path: path.resolve(__dirname, "dist"),
 filename: "[name].bundle.js",
 chunkFilename: "[name].chunk.js"
 },
 module: {
 rules: [
  {
  test: /\.scss$/,
  use: ExtractTextPlugin.extract({
   // 注意 1
   fallback: {
   loader: "style-loader"
   },
   use: [
   {
    loader: "css-loader",
    options: {
    minimize: true
    }
   },
   {
    loader: "sass-loader"
   }
   ]
  })
  }
 ]
 },
 plugins: [
 new ExtractTextPlugin({
  filename: "[name].min.css",
  allChunks: false // 注意 2
 })
 ]
};

在配置中,注意 1中的callback配置项,针对 不提取为单独css文件的scss样式 应该使用的 LOADER。即使用style-loader将 scss 处理成 css 嵌入网页代码。

注意 2中的allChunks必须指明为false。否则会包括异步加载的 CSS!

3. SCSS引用和懒加载

在项目入口文件app.js中,针对 scss 懒加载,需要引入以下配置代码:

import "style-loader/lib/addStyles";
import "css-loader/lib/css-base";

剩下我们先设置背景色为红色,在用户点击鼠标后,懒加载common.scss,使背景色变为绿色。剩余代码如下:

import "./scss/base.scss";

var loaded = false;
window.addEventListener("click", function() {
 if (!loaded) {
 import(/* webpackChunkName: 'style'*/ "./scss/common.scss").then(_ => {
  // chunk-name : style
  console.log("Change bg-color of html");
  loaded = true;
 });
 }
});

4. 打包和引入

根据我们在app.js中的webpackChunkName的配置,可以猜测,打包结果中有:style.chunk.js 文件。

命令行执行webpack打包后,/dist/目录中的打包结果如下:

webpack4 SCSS提取和懒加载的示例

最后,我们需要在 html 代码中引入打包结果中的、非懒加载的样式(/dist/app.min.css)和 js 文件(/dist/app.bundle.js)。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <link rel="stylesheet" href="./dist/app.min.css" rel="external nofollow" >
</head>
<body>
 <script src="./dist/app.bundle.js"></script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript instanceof 与typeof使用说明
Jan 11 Javascript
吐槽一下我所了解的Node.js
Oct 08 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
Nov 09 Javascript
JQuery Mobile实现导航栏和页脚
Mar 09 Javascript
jquery弹出遮掩层效果【附实例代码】
Apr 28 Javascript
jQuery双向列表选择器select版
Nov 01 Javascript
微信小程序的分类页面制作
Jun 27 Javascript
关于定制FileField中的上传文件名称问题
Aug 22 Javascript
Js利用Canvas实现图片压缩功能
Sep 13 Javascript
Vue infinite update loop的问题解决
Apr 23 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
Aug 08 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 Javascript
vue自定v-model实现表单数据双向绑定问题
Sep 03 #Javascript
详解vue-cli下ESlint 配置说明
Sep 03 #Javascript
解决vue的 v-for 循环中图片加载路径问题
Sep 03 #Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 #Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
Sep 03 #Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
Sep 03 #Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
Sep 03 #Javascript
You might like
PHP音乐采集(部分代码)
2007/02/14 PHP
destoon找回管理员密码的方法
2014/06/21 PHP
php提示Failed to write session data错误的解决方法
2014/12/17 PHP
JS对img进行操作(换图片/切图/轮换/停止)
2013/04/17 Javascript
js正则表达式注册页面表单验证
2016/10/11 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
vue复合组件实现注册表单功能
2017/11/06 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
JQuery样式与属性设置方法分析
2019/12/07 jQuery
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
Python通过poll实现异步IO的方法
2015/06/04 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
对Python w和w+权限的区别详解
2019/01/23 Python
python简单贪吃蛇开发
2019/01/28 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
nohup的用法
2012/11/26 面试题
统计员岗位职责
2013/11/14 职场文书
迟到检讨书5000字
2014/01/31 职场文书
英语教学随笔感言
2014/02/20 职场文书
爱心倡议书范文
2014/05/12 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript