美文网首页
webpack学习

webpack学习

作者: LouisJ | 来源:发表于2018-05-20 11:34 被阅读0次

    webpack是什么

    是一个模块打包器

    模块化历史

    • CommonJS
      //moduleA.js
      exports.a = 1

    //moduleB.js
    var moduleA = require('./moduleA')

    • AMD
      // moduleA.js
      define (function(){
      return {
      name: A
      }
      })

    // moduleB.js
    require(['./moduleA'], function(moduleA){
    console.log(moduleA.name)
    })

    • ES6 Modules
      //moduleA.js
      let name = 'A'
      let age = 18
      export name
      export age
      //ES6中,export和import是关键字,使用这两个可以输出和引入模块

    // moduleB.js
    import name from './moduleA'
    console.log(name)

    Get started

    • webpack默认支持CommonJS、AMD、ES Modules

    webpack.config.js学习

    • config.js是node的文件,浏览器是看不到的,只有开发者看得到

    • 配置文件的写法


      webpack.config.js

      说明:有了配置文件,就可以直接运行webpack,然后根据你配置的入口和输出位置来进行文件的打包,就不用像前面那样写一长串的命令行来指定要打包的文件,和输出的位置。

    • 运行配置文件


      修改scripts实现效果

      说明:这里只写webpack就能实现效果是因为有两个默认:1. 输入webpack,node会默认在当前目录的node_modules下寻找webpack工具包。 2. webpack会默认在当前目录下寻找webpack.config.js来作为它的配置文件。 因为有这两个默认的存在,可以直接通过webpack命令实现效果。

    • 引入变量


      引入其他模块的变量
    • 在ES6中,如果对象中的变量为name:name,那么可以直接写name作为对象中的变量

    加载css

    • 直接在文件中引入css文件


      加载css

      结果报错


      报错
      原因:webpack不知道如何处理css
    • 通过加载loaders来加载css的处理模块


      image.png
    • 为什么js可以加载css


      image.png
    • webpack使用autoprefixer-loader


      加前缀

    加载图片

    index.js写法

    1.配置图片处理loaders


    配置loaders

    2.缺少模块,进行安装


    image.png
    3.安装缺少的模块后,继续build,产生图片
    生成图片 生成图片请求 生成img标签

    压缩图片

    • 配置压缩工具


      配置压缩工具
    • 压缩完成后


      image.png
      大小对比

    webpack --watch

    • 作用:使用watch后,会监视文件是否发生改动,每次发生改动,都会自动build一次,就不用自己输代码了


      windows中的写法

      在scripts中配置命令方便使用


      配置scripts

    webpack 引用scss文件

    • 引入scss文件


      引入scss文件
    • 通过搜索loaders找到使用方法,在配置文件中写好loaders


      使用方法
      config配置
    • 安装loader


      安装loader
    • 执行build


      build

      提示缺少模块


      提示缺少模块
    • 安装node sass
      node sass是ruby社区发明的,但是node并没有完全重写这个模块,所以安装时有些注意事项

    1. 直接安装,开始前面的部分都正常,但最后有个地方有个文件的下载需要指定位置
      前面
      指定文件位置
      git bash中运行这一行代码指定下载位置 export SASS_BINARY_SITE="https://npm.taobao.org/mirrors/node-sass",然后再进行npm install node-sass来安装模块才能成功
    • less的loader的安装方法相同,有了这些后,甚至可以在项目中实现less和sass的混写

    webpack Dev Server(自动刷新工具)

    webpack-dev-server如果是3.x的话,webpack必须是4.x才不会报此TypeError: Cannot read property 'compile' of undefined错误, 同理如果webpack是3.x,则webpack-dev-server必须是2.x

    • 安装
      npm install webpack-dev-server --save-dev

    • 运行webpack dev server
      出现提示,项目在localhost8080下运行,此时打开这个地址,就能预览页面


      文件目录结构
      运行
      看看根目录下都有啥

      查看请求


      请求
      修改css,查看是否能自动刷新并查看效果
      出现问题
    • 解决前面出现的不能刷新效果的问题
      原因:首先,原因是我们访问的是dist目录,而其中的index.html引用的是dist目录下的bundle.js,这个文件是死的,也就是我们在修改css文件后,这个js文件是没有被重新build的,而根目录(也就是localhost:8080下)下的bundle.js是动态的,是活的,所以我们要引用这个js

    • 引用根目录下的bundle.js
      下图这种写法是在引用dist目录下的bundle.js,这个文件是死的。为什么呢?其实现在8080根目录下和dist目录下都有bundle.js,但是dist下的那个是死的,8080下这个是动态的,因为devserver会默认将你所有的静态资源都能在8080下访问到,只有一个bundle.js是动态的

      原来的写法
      下图这种写法在引用8080根目录下的bundle.js
      修改代码
      效果
    • 引用dist目录下的bundle.js

      dist目录下的bundle.js

    总结:webpack-dev-server其实是会默认将当前目录的所有静态文件放到localhost下,但只有一个文件是动态的,就是默认的根目录下的bundle.js,所以需要引用localhost下的bundle.js,但是我们可以通过配置来实现依赖那个js文件

    • 没有指定入口文件,需要自己点选


      点选入口文件
    • 自己配置入口


      语法

      配置文件中的写法和位置


      配置文件详情
      效果
      这时修改文件后的自动刷新可以看见效果

    webpack插件学习

    自动生成HTML插件

    • 步骤
      1.先在配置文件中引入两个插件


      配置

      2.git安装两个插件


      安装插件
      3.语法
      语法
      配置文件中的具体写法

      4.删除dist中的index.html


      删除文件
      5.启动webpack-dev-server
      启动
      注意,这里使用了一个打开网页的插件,url的端口号要和dev-server配置的端口号一样
      端口号统一
      5.效果
      执行webpack-dev-server后,会自动新建一个服务器,然后编译代码,然后打开网页
      效果
    • 没有index.html,哪来的网页?


      网页代码

      功劳其实来自刚刚的两个插件


      插件功能解释

    webpack代码部署、发布

    • 依赖的命令行
      webpack -p

    • 步骤
      1.运行webpack -p,生成html和js文件

      image.png
      2.git push上传代码
      image.png
      3.github上开启预览页面,实现预览
    • 发布后效果


      效果

      代码体积大大减小


      代码体积减小

    几个补充

    • 回到最开始,webpack其实就是个打包器,就像刚刚上面所实现的,将所有东西,图片、js、css、html都打包成一个bundle.js,然后这些东西通过一个文件放到页面上。还有另一个概念,就是为模块化而生的打包器,就像我们刚刚生成的bundle,就是一个模块,它内部有自己的逻辑,也就是各个文件之间的逻辑,不受别人影响,也不影响别人,就是一个独立的模块,这样就让我们的代码条理清晰,不会出现写一个1000代码的js,而是10个100行代码的js。


      为模块化而生的打包器
    • bundle.js有问题
      这时的bundle.js还是从缓存中获取的,如果我们升级了呢?那用户还是用的旧的,所以应该加个哈希,让用户能保持最新的代码来使用


      bundle.js问题

    添加步骤
    1.在配置文件中输出的bundle.js后加上-[hash]

    image.png
    2.执行webpack -p,发现bundle.js多了哈希
    image.png
    3.修改文件,重新压缩,bundle.js的哈希也会发生变化
    image.png

    这样一来,用户既能快速访问旧的功能,但同时又能保持新的功能的更新

    • 为什么要自动生成html
      因为html引用的js是最新build的,如果自己维护,根本不知道哈希已经变成什么了


      image.png
    • 如果想在自动成的html中加东西怎么办?例如,我想加个meta,这个是有选项的,可查阅文档实现

    相关文章

      网友评论

          本文标题:webpack学习

          本文链接:https://www.haomeiwen.com/subject/uesgrftx.html