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 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
初学JavaScript第二章
Sep 30 Javascript
javascript实现的基于金山词霸网络翻译的代码
Jan 15 Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
java与javascript之间json格式数据互转介绍
Oct 29 Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
Vue press 支持图片放大功能的实例代码
Nov 09 Javascript
vue实现可视化可拖放的自定义表单的示例代码
Mar 20 Javascript
微信小程序动态添加和删除组件的现实
Feb 28 Javascript
keep-alive不能缓存多层级路由菜单问题解决
Mar 10 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
一个简单的MySQL数据浏览器
2006/10/09 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
PHP获取路径和目录的方法总结【必看篇】
2017/03/04 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
JS 毫秒转时间示例代码
2013/09/22 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
vue中使用极验验证码的方法(附demo)
2019/12/04 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
Python类的继承和多态代码详解
2017/12/27 Python
django2.0扩展用户字段示例
2019/02/13 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
妇产科护士自我鉴定
2013/10/15 职场文书
培训主管的岗位职责
2013/11/23 职场文书
咖啡店的创业计划书,让你hold不住
2014/01/03 职场文书
高三学习决心书
2014/03/11 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
古诗之感恩老师
2019/10/24 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
Android 中的类文件和类加载器详情
2022/06/05 Java/Android