本文旨在通过一个一个实战例子来学习webpack如何配置,更加深入的学习webpack在实战项目中如何配置。

我们学习哪些配置呢?

【基础配置】

  • 打包JS
  • 编译ES6
  • 编译typeScript
  • 打包公共代码
  • 代码分割和懒加载
  • 打包css
  • 打包less sass
  • 提取css为独立文件
  • postCss的使用
  • js Tree-shaking
  • css Tree-shaking
  • 图片处理(css中引入图片、base64编码)
  • 压缩图片,自动合成雪碧图sprite、retina处理
  • 字体文件处理
  • 处理第三方JS库
  • 生成HTML
  • HTML中引入图片
  • 优化webpack配置

** 所有实际代码都可在github上查看:https://github.com/shiyou00/webpack **

webpack命令

webpack -h //帮助简写
webpack -v //webpack版本号
webpack <entry> [<entry>] <output> // 执行webpack输入输出命令
--config 指定将要执行的webpack配置文件 : webpack --config webpack.conf.dev.js 指定将要执行的webpack配置文件为 webpack.conf.dev.js
--env 指定运营环境
--watch 监测文件变化
--debug loaders打开调试状态
--devtool 开发工具生成sourceMap

打包JS

创建文件index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>打包JS</title>
</head>
<body>

<script src="bundle.js"></script>
</body>
</html>

创建文件app.js

import sum from './sum';
console.log('sum(1,7)=',sum(1,7));

创建文件sum.js

export default function (a,b){
    return a + b;
}

创建webpack.config.js

module.exports = {
    entry: {
        app : './app.js'
    },
    output: {
        filename : 'bundle.js' // filename : '[name].[hash:5].js'
    }
};

解释:filename: '[name].[hash:5].js' => [name]根据输入的文件名输出;[hash:5]输出五位hash值

然后执行webpack命令输出了bundle.js文件
打开index.html,并打开控制台就可以看到正确的输出了

---------------------------

编译ES6

需要使用的工具
Babel
- babel-loader
- babel/core

首先安装依赖

npm install -save-dev babel-loader @babel/core

主意:babel-loader babel-core 这些有强的版本依赖关系的,必须得版本对了运行才会对的。具体版本号在git上面的package.json中可以看到

Babel Presets

使用babel的什么规范打包
es2015
es2016
es2017
env : 包含2015到最近的版本的一个汇总,所以开发中常用这个

安装presets(使用什么就安装什么)

npm install @babel/preset-env --save-dev

app.js

let func = () => {};
const NUM = 45;
let arr = [1,2,4];
let arr2 = arr.map(item => item * 2);

console.log('new Set', new Set(arr2));

webpack.config.js

module.exports = {
    entry: {
        app: './app.js'
    },

    output: {
        filename: '[name].[hash:8].js'
    },

    module:{
        rules:[
            {
                test: /\.js$/,           // 使用正则匹配的文件名
                use: {
                    loader: 'babel-loader', // 使用的loader
                    options: {
                        presets: [
                            ['@babel/preset-env',{
                                targets : { // targets:指定符合哪些条件的范围内编译
                                    browsers:['> 1%', 'last 2 versions']
                                }
                            }]
                        ],
                    }
                },
                exclude: '/node_modules/' // 需要排除的文件
            }
        ]
    }
}

运行webpack,看下运行的文件的结果

可以看到已经成功的编译了ES6

【.babelrc】
配置babel的使用规则,把babel配置从webpack中拎出来

{
  "presets": [
    ["@babel/preset-env",{
      "targets" : {
        "browsers":["> 1%", "last 2 versions"]
      }
    }]
  ]
}

同时把webpack.config.js修改下

module.exports = {
    entry: {
        app: './app.js'
    },

    output: {
        filename: '[name].[hash:8].js'
    },

    module:{
        rules:[
            {
                test: /\.js$/,           // 使用正则匹配的文件名
                use: {
                    loader: 'babel-loader' // 使用的loader
                },
                exclude: '/node_modules/' // 需要排除的文件
            }
        ]
    }
}

运行下发现也是成功的。

正常配置只能兼容IE9+浏览器,那么要兼容IE8的浏览器要怎么办呢?
【Babel Polyfill】
全局垫片,为应用准备

安装:npm install babel-polyfill --save

直接在代码app.js中引入即可

import "babel-polyfill"; // 添加在最上面即可

然后运行下,发现也是成功的


【Babel Runtime Transform】
局部垫片,开发框架使用

安装:
npm install @babel/plugin-transform-runtime --save-dev
npm install @babel/runtime --save

然后配置.babelrc文件

{
  "presets": [
    ["@babel/preset-env",{
      "targets" : {
        "browsers":["> 1%", "last 2 versions"]
      }
    }]
  ],
  "plugins": ["@babel/plugin-transform-runtime"]
}

相应的demo可以去github上找:点击我

编译typeScript

typescript-loader

安装相应的依赖

npm i typescript ts-loader --save-dev // 官方的
npm i typescript awesome-typescript-loader --save-dev // 社区的

由于版本冲突问题,建议直接使用github中的package.json中的版本确保可以编译成功

需要配置tsconfig.json

{
  "compilerOptions": {
    "module": "commonjs", // 指定生成哪个模块系统代码
    "target": "es5", // 指定ECMAScript目标版本
    "allowJs": true // 允许编译javascript文件
  },
  "include": [
    "./src/*" // 要编译的路径
  ],
  "exclude": [
    "./node_modules" // 不编译的路径
  ]
}

tsconfig所有配置列表:tsconfig配置表

app.ts

const NUM = 45;

interface Cat {
    name: string,
    age: number
}

function cat(cat: Cat) {
    console.log('cat',cat.name);
}

cat({
    name: 'jack',
    age:17
});

webpack.config.js

module.exports = {
    entry: {
        'app': './app.ts'
    },

    output: {
        filename: '[name].bundle.js'
    },

    module: {
        rules: [
            {
                test: /\.tsx?$/,
                use: {
                    loader: 'ts-loader'
                }
            }
        ]
    }
}

然后运行webpack看下打包后的内容

webpack3.x版本实战案例【基础配置篇】(一)的更多相关文章

  1. iView 实战系列教程(21课时)_1.iView 实战教程之配置篇

    1.iView 实战教程之配置篇 点击添加插件,. 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动项目 入口文件导入了 ...

  2. Flume实战案例运维篇

    Flume实战案例运维篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Flume概述 1>.什么是Flume Flume是一个分布式.可靠.高可用的海量日志聚合系统,支 ...

  3. 深入浅出 webpack 之基础配置篇

    前言 前端工程化经历过很多优秀的工具,例如 Grunt.Gulp.webpack.rollup 等等,每种工具都有自己适用的场景,而现今应用最为广泛的当属 webpack 打包了,因此学习好 webp ...

  4. lxc 容器基础配置篇

    一, 首先配置lxc需要的网卡断 吧eth0复制一份变为br0 配置br0 配置eth0 重启网卡   /etc/init.d/network restart 安装lxc软件 需要epel源--- y ...

  5. iView 实战系列教程(21课时)_1.iView 实战教程之配置篇_图片优化

    首先需要安装vue cli 3.0版本 点击添加插件, 输入iview 选中后安装 全部导入还是按需导入. 2.是否需要自定义主题变量 3.多语言的设置. 这里我们全部选择为默认 然后点击继续. 启动 ...

  6. 提高开发效率之VS Code基础配置篇

    背景 之前一直是只用WebStorm作为IDE来编写代码,但是由于: 手中的这台Mac接了两个显示器以后,使用WebStorm会有卡顿. WebStorm需要付费(虽然可以通过某方法和谐). 所以需要 ...

  7. 从零开始用electron整个跨平台桌面应用---基础配置篇

    1.安装node.npm node以及npm都需要是最新版本(版本过低有坑) 2.安装淘宝镜像cnpm(建议,下载较快) npm install -g cnpm --registry=https:// ...

  8. 【Dubbo实战】基础学习篇(一)

    Dubbo的简单介绍 是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000多个服务提供30多亿次訪问量支持.并被广泛应用于阿里巴巴集团的各成员网站. Dubbo是一个分布式服 ...

  9. 阿里云ECS服务器Linux环境下配置php服务器(一)--基础配置篇

    开始安装软件了,我们需要安装的软件有apache,php和MySQL. ps:如果你购买的是北京的服务器,有个安全组需要设置,我全部用的默认设置,暂时还没发现会有什么影响. 首先关闭SELINUX(S ...

随机推荐

  1. MT【289】含参绝对值的最大值之三

    已知$a>0$,函数$f(x)=e^x+3ax^2-2e x-a+1$,(1)若$f(x)$在$[0,1]$上单调递减,求$a$的取值范围.(2)$|f(x)|\le1$对任意$x\in[0,1 ...

  2. WC2019 tree

    WC2019唯一一道正常的题,考场上没什么想法,也只拿到了暴力分.搞了一天终于做完了. 前置知识:purfer序,多项式exp或分治FTT. 对于\(type=0\)的,随便维护下,算下联通块即可. ...

  3. 【LOJ6053】简单的函数(min_25筛)

    题面 LOJ 题解 戳这里 #include<iostream> #include<cstdio> #include<cstdlib> #include<cs ...

  4. 【BZOJ1831】[AHOI2008]逆序对(动态规划)

    [BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...

  5. [USACO08DEC]在农场万圣节Trick or Treat on the Farm【Tarja缩点+dfs】

    题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...

  6. 【bfs】仙岛求药

    [题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ...

  7. luogu3759 不勤劳的图书管理员 (树状数组套线段树)

    交换的话,只有它们中间的书会对答案产生影响 树状数组记位置,套线段树记书的编号 它对应的页数和书的个数 然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上 别忘了考虑这两个自己交换以后是不 ...

  8. 学习笔记:fhq-treap

    0. 前置知识:\(treap\)的定义 树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树. ​ >--摘自百度百科 形象化 ...

  9. hdu 4300 Clairewd’s message(扩展kmp)

    Problem Description Clairewd is a member of FBI. After several years concealing in BUPT, she interce ...

  10. es6+的javascript拓展内容

    一.let,const 1.因为块级的作用域,这样打印01234,循环外打印i会报错 for (let i = 0; i < 5; i++) { setTimeout(console.log(i ...