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 相关文章推荐
070823更新的一个[消息提示框]组件 兼容ie7
Aug 29 Javascript
jquery validate 自定义验证方法介绍 日期验证
Feb 27 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
js中跨域方法原理详解
Jul 19 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
javaScript如何跳出多重循环break、continue
Sep 01 Javascript
多种方式实现js图片预览
Dec 12 Javascript
js实现倒计时关键代码
May 05 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
js监听html页面的上下滚动事件方法
Sep 11 Javascript
详解微信UnionID作用
May 15 Javascript
Vue实现跑马灯效果
May 25 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+JS+rsa数据加密传输实现代码
2011/03/23 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
php上传文件问题汇总
2015/01/30 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python中max函数用法实例分析
2015/07/17 Python
详解python3百度指数抓取实例
2016/12/12 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
使用requests库制作Python爬虫
2018/03/25 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python实现搜索算法的实例代码
2020/01/02 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
高中生学习生活的自我评价
2013/11/27 职场文书
动漫专业高职生职业生涯规划书
2014/02/15 职场文书
知识竞赛活动方案
2014/02/18 职场文书
企业文化宣传标语
2014/06/09 职场文书
交心谈心活动总结
2015/05/11 职场文书
干部外出学习心得体会
2016/01/18 职场文书
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB