zoukankan      html  css  js  c++  java
  • 8-webpack之loader

    1、关于loader

    在之前的实例中,主要是用 webpack 来处理 js 代码,并且 webpack 会自动处理 js 之间相关的依赖,


    但在开发中往往不仅仅有基本的 js 代码处理,也需要加载 css、图片,也包括一些高级的将 ES6、TypeScript 转成 ES5 代码,

    将scss、less 转成 css,将 .jsx、.vue 文件转成 js 文件等;


    对于webpack本身的能力来说,对于这些转化是不支持的,我们需要给 webpack 扩展对应的 loader;


    loader 是 webpack 中一个非常核心的概念,webpack 可以使用 loader 来预处理文件;


    2、css-loader

    (1)loader的安装配置

    通过 npm 安装需要使用的 loader:

         npm install style-loader css-loader --save-dev


    style-loader  :将模块的导出作为样式添加到 DOM 中

    css-loader  :解析 CSS 文件后,使用 import 加载,并且返回 CSS 代码


    在 webpack.config.js 中的 module关键字下进行配置:

    module.exports = {
      …,
      module: {
        rules: [
          {
            test: /.css$/,
            // webpack 在读取使用的loader的过程中,是按照从右向左的顺序读取的,所以顺序不能颠倒
            use: [ 'style-loader', 'css-loader' ]
          }
        ]
      }
    }


    3、CSS文件的处理

    项目开发过程中,我们必然需要添加很多的样式,而样式我们往往写到一个单独的文件中;


    结构如下,CSS文件和js文件分别有不同的目录:

    image


    在 normal.css 中,将 body 设置为 red:

    body {
        background-color: red;
    }


    这时,normal.css 中的样式是不会生效的,因为我们还没有引用它,所以 webpack 不能找到该文件;

    在入口文件 main.js 中引用 css 文件:

    // 引用 css 文件
    require('./css/normal.css')


    配置完成以后,可以使用 npm run build 命令将 css 文件代码也一并打包到 bundle.js 文件中了,此时,css 中的代码会生效:


    4、less文件处理

    less-loader 加载和转译 LESS 文件;


    安装:

    npm install --save-dev less-loader less


    在 css 文件夹中新建 less 文件 special.less:

    @fontSize:50px;
    @fontColor:orange;
    
    body{
      color: @fontColor;
      font-size: @fontSize;
    }


    配置:

    {
            test: /.less$/,
            use: [{
              loader: "style-loader", // creates style nodes from JS strings
            }, {
              loader: "css-loader" // translates CSS into CommonJS
            }, {
              loader: "less-loader", // compiles Less to CSS
            }]
          }


    image


    在 main.js 中引入 less 文件:

    // 引用 less 文件
    require('./css/special.less')
    // 为了查看 less 生效的代码,添加一些文字
    document.writeln('<h2>你好,小鸣</h2>')


    使用npm run build打包,查看效果;


    5、url-loader 和 file-loader

    file-loader :将文件发送到输出文件夹,并返回(相对)URL;

    url-loader :像 file loader 一样工作,但如果文件小于限制,可以返回 data URL;


    (1)url-loader 

    在src/img下准备两张图片,一张(test.jpg)小于13kb,一张(timg.jpg)大于13kb;

    image


    修改normal.css文件,设置test.jpg为背景:

    body {
      /*background-color: darkgray;*/
      background: url("../img/timg.jpg");
    }


    安装 url-loader:

    npm install --save-dev url-loader


    修改 webpack.config.js 配置文件,配置 url-loader:

    {
      test: /.(png|jpg|gif)$/,
      use: [{
        loader: 'url-loader',
        options: {
        limit: 13000
        }
      }]
    }


    打包,运行 index.html,就会发现背景图片渲染出来了;


    此时的背景图是通过base64显示出来的;

    image

    其实,这是limit属性的作用,当图片小于13kb时,对图片进行base64编码:


    (2)、file-loader

    那么问题来了,如果图片大于 13kb 呢?

    将 background 的图片改成 timg.jpg:

    body {
        /* background-color: red; */
        background: url(../img/timg.jpg);
    }

    此时再打包就会报错,这是因为大于 13kb 的图片,会通过 file-loader 进行处理,但项目中并没有 file-loader,所以需要安装一下 file-loader:

    npm install --save-dev file-loader


    再次打包运行,会发现 dist 文件夹下多了一个图片文件;


    但是,我们发现图片并没有显示出来,这是因为图片使用的路径不正确,

    默认情况下,webpack 会将生成的路径直接返回给使用者,但我们整个程序是打包到了 dist 文件夹下的,所以这里需要在路径下再添加一个 dist/


    再次打包运行,发现 timg.jpg 的背景能够显示出来了;

    image


    (3)修改图片文件名称

    webpack 自动帮助我们为图片生成了一个非常长的名字,这是一个32位 hash 值,目的是防止名字重复;

    但在真实开发中,我们可能对打包的图片名字有一定的要求,比如:将所有的图片放在一个文件夹中,跟上图片原来的名称,同时也要防止重复;


    所以,我们可以在 options 中添加如下选项:

    • img:文件要打包到的文件夹
    • name:获取图片原来的名字,放在该位置
    • hash:8:为了防止图片名称冲突,依然使用 hash,但是我们只保留8位
    • ext:使用图片原来的扩展名


    image


    再次打包,发现在 dist/img 文件夹中的图片是按照我们预先设定的名字命名:

    image


    6、babel-loader

    webpack 打包的 js 文件中,ES6 语法并没有转成 ES5,那么就意味着可能一些对 ES6 还不支持的浏览器没有办法很好的运行我们的代码;


    如果希望将 ES6 的语法转成 ES5,那么就需要使用 babel;

    在webpack中,直接使用 babel 对应的 loader 就可以了;


    安装babel-loader:

    npm install --save-dev babel-loader@7 babel-core babel-preset-es2015


    配置 webpack.config.js 文件:

    {
            test: /.js$/,
            // exclude: 排除
            // include: 包含
            exclude: /(node_modules|bower_components)/,
            use: {
              loader: 'babel-loader',
              options: {
                presets: ['es2015']
              }
            }
          }

    image


    重新打包,查看 bundle.js 文件,发现其中的内容变成了 ES5 的语法;

  • 相关阅读:
    spring boot中创建ElasticSearch索引
    spring boot项目16:ElasticSearch-基础使用
    spring cloud项目07:网关(Gateway)(2)
    spring cloud项目06:网关(Gateway)(1)
    Ubuntu上MySQL多实例部署
    MySQL常用命令、配置汇总
    spring boot项目15:安全-基础使用(2)
    spring boot项目14:安全-基础使用(1)
    docker-compose mongodb 副本
    关于golang slice切片的一个问题
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/13672227.html
Copyright © 2011-2022 走看看