美文网首页让前端飞
webpack4入门学习笔记(二)

webpack4入门学习笔记(二)

作者: qfstudy | 来源:发表于2019-04-21 22:25 被阅读1次

    系列博客链接

    代码

    下载代码(demo2):github

    笔记的代码是在前面笔记基础上修改的,可以下载代码:github参考或是先看前面的笔记。


    html-webpack-plugin的使用

    安装
    npm i html-webpack-plugin -D

    webpack4.0入门学习笔记(一)中,我们是自己在打包目录下创建index.html对打包后js文件进行引用。

    html-webpack-plugin插件可以根据对应的模板在打包的过程中自动生成index.html,并且能够对打包的文件自动引入。

    index.html模板

    <!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>模板</title>
    </head>
    <body>
      <div id="root"></div>
    </body>
    </html>
    

    webpack.config.jsplugins中配置如下

    const path = require('path')
    const htmlWebpackPlugin = require('html-webpack-plugin')
    
    module.exports={
      entry: {
        main: './src/index.js'
      },
      //打包完成后文件存放位置配置
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname,'dist')
      },
      
      plugins: [
        new htmlWebpackPlugin({
          template: './index.html'
        })
      ]
    }
    

    在终端执行npm run start,打包完成后在dist目录下自动生成index.html文件,并且还自动引入打包后的其他文件。

    clean-webpack-plugin的使用

    每次打包生成的dist目录,如果改一次代码,都得要删除一次dist目录,这样很麻烦,可以通过clean-webpack-plugin在每次打包的时候自动清空dist目录。

    安装
    npm i clean-webpack-plugin -D

    webpack.config.jsplugins中配置如下

    const path = require('path')
    const htmlWebpackPlugin = require('html-webpack-plugin')
    const cleanWebpackPlugin = require('clean-webpack-plugin')
    
    module.exports={
      entry: {
        main: './src/index.js'
      },
      //打包完成后文件存放位置配置
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname,'dist')
      },
      
      plugins: [
        new htmlWebpackPlugin({
          template: './index.html'
        }),
        new cleanWebpackPlugin()
      ]
    }
    

    entryoutput多入口配置

    module.exports={
      mode: 'development', //development: 开发环境 production:生产环境
      entry: {
       //多入口
        main: './src/index.js',
        index: './src/index.js'
      },
      //打包完成后文件存放位置配置
      output: {
        //name与entry对象的属性对应
        filename: '[name].js', //打包成main.js index.js
        path: path.resolve(__dirname,'dist')
      }
    }
    

    当有多入口的时候,需要修改filename的属性值为'[name].js',还有其他写法,具体可以查看文档。

    配置devtool

    devtool决定源代码与打包后的代码之间的映射关系,方便对代码进行调试。

    开发环境推荐: cheap-module-eval-source-map
    生产环境推荐: cheap-module-source-map

    devtool具体内容请查阅:文档:devtool

    module.exports={
      devtool: 'cheap-module-eval-source-map',
      //开发环境推荐: cheap-module-eval-source-map
      //生产环境推荐: cheap-module-source-map
    }
    

    配置devServer

    官网:devServer

    安装webpack-dev-server
    npm i webpack-dev-server -D

    在webpack.config.js中添加以下内容

    module.exports={
      devServer: {
        contentBase: './dist',
        // open: true, //自动打开浏览器
        // port: 8080, //默认8080
      }
    }
    

    修改package.jsonscript

     "scripts": {
        "start": "webpack-dev-server"
      },
    

    执行npm run start后打开浏览器就可以看到效果,当我们修改代码的时候页面就会重新刷新。

    有时我们希望页面只更换我们修改的那一部分就可以了,而并不是全部都刷新一遍,所以需要启用webpack的热模块替换功能。

    启用webpack的热模块替换功能

    添加以下内容:

    const webpack=require('webpack')
    
    plugins:[
      new webpack.HotModuleReplacementPlugin()
    ]
     devServer: {
      hot: true, //启用webpack的热模块替换功能
       hotOnly: true //hotOnly不是必须的
     }
    

    完整的配置如下:

    const path = require('path')
    const htmlWebpackPlugin = require('html-webpack-plugin')
    const cleanWebpackPlugin = require('clean-webpack-plugin')
    const webpack=require('webpack')
    
    module.exports={
     plugins: [
        new htmlWebpackPlugin({
          template: './index.html'
        }),
        new cleanWebpackPlugin(),
        new webpack.HotModuleReplacementPlugin()
      ],
      devServer: {
        contentBase: './dist',
        // open: true, //自动打开浏览器
        // port: 8080, //默认8080
        hot: true, //启用webpack的热模块替换功能
        hotOnly: true //devServer.hot在没有页面刷新的情况下启用热模块替换作为构建失败时的后备
      }
    }
    

    hot:true启用HotModuleReplacementPlugin(HMR)

    通过引入样式测试

    style.css

    body{
      background: yellow;
    }
    div:nth-of-type(odd){
      background: cyan;
    }
    

    index.js

    //通过改style.css样式测试热模块替换效果
    import './style.css'
    
    var btn = document.createElement('button')
    btn.innerHTML='新增'
    document.body.appendChild(btn)
    
    btn.onclick=function(){
      var div=document.createElement('div')
      div.innerHTML='items'
      document.body.appendChild(div)
    }
    

    执行npm run start,在浏览器打开以后,修改div的背景颜色,只有改变的地方才发生变化,但是页面并没有刷新。

    但是在引入js文件的时候,热模块替换的实现方式有点区别。

    js要达到热模块替换的效果,得要if(module.hot){}这一部分代码,否则就算改了代码,页面不刷新,修改的地方在页面上页面变化。

    css样式因为css-loader已经实现if(module.hot){}这一部分,所以不需要单独实现这一部分。

    index.js

    import number from './number'
    import add from './add'
    add()
    number()
    
    if(module.hot){
      module.hot.accept('./add.js',function(){
        add()
        document.getElementById('root').removeChild(document.getElementById('add'))
      })
      module.hot.accept('./number.js',function(){
        number()
        document.body.removeChild(document.getElementById('number'))
      })
    }
    

    add.js

    function add(){
      var div=document.createElement('div')
      div.innerHTML=9
      div.setAttribute("id","add")
      let root=document.getElementById('root')
      root.appendChild(div)
    }
    
    export default add
    

    number.js

    var number=function(){
      var div=document.createElement('div')
      div.setAttribute("id","number")
      div.innerHTML=1030
      document.body.appendChild(div)
    }
    
    export default number
    

    下一篇:webpack4入门学习笔记(三)--Babel的使用

    相关文章

      网友评论

        本文标题:webpack4入门学习笔记(二)

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