WebPack4.x学习笔记

视频推荐:https://www.bilibili.com/video/av51579321/?p=10
WebPack官网:https://webpack.js.org/(尽量看英文的,中文版本的有些没及时更新)

课时1 webpack4介绍

1.webpack4新特性
webpack需要设置mode属性,可以是development或production.例如:webpack --mode development
webpack针对development-开发模式的特性
1)浏览器调试工具
2)注释、开发阶段的详细错误日志和提示
3)快速和优化的增量构建机制
webpack针对production-生产模式提供的特性
1)开启所有的代码优化
2)更小的bundle大小
3)去除掉只有开发阶段运行的代码
4)Scope hosting和Tree-shaking

2.插件和优化
webpack4删除了CommonsChunkPlugin插件,它使用内置APIoptimization.splitChunks和optimization.runtimeChunk,
这意味着webpack会默认为你生成共享的代码块。(还有其他几个)

3.开箱即用WebAssembly,wasm会带来性能的大幅提升,允许浏览器运行二进制文件,可以通过编写loaders来直接import C++、C或Rust。

4.支持多种模块类型
共5种:
javascript/auto:在webpack3里,默认开启对所有模块系统的支持,包括CommonJS、AMD、ESM。
javascript/esm:只支持ESM这种静态模块。
javascript/dynamic:只支持CommonJS和AMD这种动态模块。
json:支持支JSON数据,可以通过require和import来使用。
webassenbly/experimental:只支持wasm模块,目前处于试验阶段。

5.0CJS 含义是0配置,webpack4受Parcel打包工具启发,尽可能的让开发者运行项目的成本变低。为了做到0配置,webpack4不再强调
需要webpack.config.js作为打包的入口配置文件了,它默认的入口为'./src/'和默认出口'./dist',对小项目而言是福音。

6.新的插件系统
webpack4对插件系统进行了不少修改,提供了针对插件和钩子的新API.
变化如下:
1)所有的hook由hooks对象同一管理,它将所有的hook作为可扩展的类属性。
2)当添加插件时,必须提供一个插件名称。
3)开发插件时,可以选择sync/callback/prpmise作为插件类型。
4)可以通过this.hooks = {myHook:new SyncHool(...)}来注册hook了。

注意点:当使用webpack4时,确保使用Node.js的版本>=8.9.4。因为webpack4使用了很多JS新的语法,他们在新版本的v8里经过了优化。

课时2 安装与基本命令

npm install webpack-cli -g
npm install webpack -g
webpack --mode development xxx.js -o bundle.json

课时3 配置文件_入口出口

//单个文件
const path = require('path');

module.exports = {
    entry: './input.js',
    output: {
        path: path.resolve(__dirname,'dist'),
        filename: 'output.bundle.js'
    }
};
//多个文件
module.exports = {
    entry: {//多个打包入口
        home: './home.js',
        about: './about.js',
        other: './other.js',
    },
    output: {
        path: path.resolve(__dirname,'dist'),
        filename: '[name].bundle.js'
    },
    mode:'development',//其它参数production 
};

课时4 加载器_url-loader

loaders用来对源文件预处理,处理成浏览器能执行的文件。

const path = require('path');

module.exports = {
    entry: './input.js',
    output: {
        path: path.resolve(__dirname,'dist'),
        filename: 'output.bundle.js'
    },
    mode:'development',
    module:{
      rules: [
        {
          test: /\.(png|jpg|gif)$/i,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 18192 //限制图片的大小,如果图片大小在限制范围内,则打包时转化为base64,否则还是普通的物理文件
              }
            }
          ]
        }
      ]
    }
};
npm init -y //生成package.json
npm install url-loader -S //安装url-loader,-S是安装完url-loader之后记录到package.json中
npm install file-loader -S //使用url-loader同时需要安装file-loader

课时5 加载器babel-loader

把ES6代码(ES2015、ES2016、ES2017、ES2018)转化为浏览器(主要指的是低版本的浏览器,高版本的google浏览器支持大部分ES6语法规则)支持的ES5代码,Angular/Vue/React都需要用到babel-loader。
安装:npm install -D babel-loader @babel/core @babel/preset-env webpack

module: {
  rules: [
    {
      test: /\.m?js$/, //正则
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env'],
          plugins: ['@babel/plugin-proposal-object-rest-spread'] //添加支持的插件,如支持React语法规则,注意:正则需要扩展文件的扩展名
        }
      }
    }
  ]
}

课时6 加载器sass-loader

将sass 转化为css 并打包到js文件中。
安装:npm install sass-loader node-sass webpack --save-dev或者cnpm install sass-loader node-sass -D
同时需要安装:cnpm install style-loader css-loader -D
配置文件:

module: {
        rules: [{
            test: /\.scss$/,
            use: [
                "style-loader", // creates style nodes from JS strings
                "css-loader", // translates CSS into CommonJS
                "sass-loader" // compiles Sass to CSS, using Node Sass by default
            ]
        }]
    }

sass 可理解为可编程css,如:

$color:#fff; //变量

body{
    background: $color;
}

课时7 插件minCssExtract

把sass 转化成css 后,输出到css文件中去,实现js与css的分离。
安装:npm install --save-dev mini-css-extract-plugin或者cnpm install mini-css-extract-plugin -D
需修改的配置文件:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

plugins: [
      new MiniCssExtractPlugin({
        // Options similar to the same options in webpackOptions.output
        // both options are optional
        filename: '[name].css',
        chunkFilename: '[id].css',
      }),
    ],
module: {
        rules: [{
          test: /\.scss$/,
          use: [ 
              // "style-loader", // creates style nodes from JS strings
              MiniCssExtractPlugin.loader,
              "css-loader", // translates CSS into CommonJS
              "sass-loader" // compiles Sass to CSS, using Node Sass by default]
          ]
        }]
    }

课时8 插件DefinePlugin

DefinePlugin 允许创建一个在编译时可以配置的全局常量。这可能会对开发模式和发布模式的构建允许不同的行为非常有用。如果在开发构建中,而不在发布构建中执行日志记录,则可以使用全局常量来决定是否记录日志。这就是 DefinePlugin 的用处,设置它,就可以忘记开发和发布构建的规则。

const webpack =  require('webpack');
plugins: [
      new MiniCssExtractPlugin({
        // Options similar to the same options in webpackOptions.output
        // both options are optional
        filename: '[name].css',
        chunkFilename: '[id].css',
      }),
      new webpack.DefinePlugin({
        'SERVICE_URL': JSON.stringify('https://www.baidu.com')
      }),
    ],

在js中使用该全局变量:SERVICE_URL

async function sayHello(){
    const result = await fetch(SERVICE_URL);
    console.log(result);
}
这样可以针对开发模式和生产模式分别设置配置文件,而不用维护代码,给维护带来了极大便利。

课时9 插件HtmlWebpackPlugin

HtmlWebpackPlugin简化了HTML文件的创建,以便为你的webpack包提供服务。这对于在文件名中包含每次
会随着编译而发生变化哈希的 webpack bundle 尤其有用。 你可以让插件为你生成一个HTML文件,使用
lodash模板提供你自己的模板,或使用你自己的loader。
安装:npm install --save-dev html-webpack-plugin或者cnpm install html-webpack-plugin -D
配置:

const HtmlWebpackPlugin = require('html-webpack-plugin');
vconst path = require('path');

const webpackConfig = {
  entry: 'index.js',
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: 'index_bundle.js'
  },
  plugins: [new HtmlWebpackPlugin()]
};

运行webpack命令后生成的html中自动引用生成的css和js文件。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Webpack App</title>
  <link href="main.css" rel="stylesheet"></head>
  <body>
  <script type="text/javascript" src="output.bundle.js"></script></body>
</html>

但是我们通常除了引用打包的js外还需要应用其它的js等文件,比如jquery等,此时就需要进一步配置了。
修改的配置文件:

plugins: [ new HtmlWebpackPlugin({
        title: 'Good Morning',//title可以应用到html文件中
        filename: 'index.html',//输出文件
        template: 'template.html'//自己的输入文件
      })]

自己的html(template)文件:

<!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><%= htmlWebpackPlugin.options.title %></title>
    <script src="https://code.jquery.com/jquery-3.4.1.js"
        integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
        crossorigin="anonymous"></script>
</head>
<body>
    <div id="good"></div>
</body>
</html>

打包之后的html(index)文件

<!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>Good Morning</title>
    <script src="https://code.jquery.com/jquery-3.4.1.js"
        integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
        crossorigin="anonymous"></script>
<link href="main.css" rel="stylesheet"></head>
<body>
    <div id="good"></div>
<script type="text/javascript" src="output.bundle.js"></script></body>
</html>

课时10 热替换

每次修改代码就需要编译一下,这样操作会很繁琐。期望编译操作是自动化的。
安装:npm install webpack-dev-server --save-dev或者cnpm install webpack-dev-server -D
配置:

module.exports = {
  //...
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,//是否压缩
    port: 9000
  }
};

运行cmd命令:webpack-dev-server 但是这个并没有全局安装,是个坑,可以在package.json文件中进行设置.

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

运行cmd命令:npm run start
没有局部安装webpack-cli,打包时出错了。安装cnpm install webpack-cli -D
修改html时,服务器自动编译.


课时11 webpack4升级实战

开发项目。npm install vue-cli -g
vue开发,脚手架用的webpack3,如何升级到webpack4
解决思路:先升级webpack到4,然后根据项目报错信息升级对应升级的组件,是个系统的工程。

cnpm install XXX 这个-D,-S 如何区分:如果安装要保存到package.json的dependencies节点中,用的是-S,如果是devDepencies中则用的是-D

webpack 和webpack-dev-server 是配套的,版本一致。

升级组件时一般用的是latest,可能有的要用next版本,这是个坑:

cnpm install extract-text-webpack-plugin@latest -D 
cnpm install extract-text-webpack-plugin@next -D 还没对外发布,但已经开发完了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容