webpack之基础篇

1.webpack简介

Webpack是⼀个打包模块化JavaScript的工具,它会从入口模块出发,识别出源码中的模块化导⼊语句,递归地找出入口⽂件的所有依赖,将入口和其所有的依赖打包到⼀个单独的文件中。

2.webpack安装

2.1环境准备

nodejs 官网
版本参考官⽹发布的最新版本,可以提升webpack的打包速度

2.2 安装webpack

  • 全局安装 (不推荐)
# 安装webpack V4+版本时,需要额外安装webpack-cli
npm install webpack webpack-cli -g
# 检查版本
webpack -v
# 卸载
npm uninstall webpack webpack-cli -g

全局安装webpack,会将你的项目中的webpack锁定到具体的版本,造成不同的项目因为webpack依赖不同版本而导致冲突,构建失败。

  • 项目安装 (推荐)
# 安装最新的稳定版本
npm i -D webpack
# 安装指定版本
npm i -D webpack@<version>
# 安装最新的体验版本 可能包含bug,不要⽤于⽣产环境
npm i -D webpack@beta
# 安装webpack V4+版本时,需要额外安装webpack-cli
npm i -D webpack-cli
  • 检查安装
webpack -v //command not found 默认在全局环境中查找
npx webpack -v// npx帮助我们在项⽬中的node_modules⾥查找webpack
./node_modules/.bin/webpack -v//到当前的node_modules模块⾥指定webpack

3. webpack执行构建

3.1 webpack默认配置

  • webpack默认支持js模块和json模块
  • ⽀持CommonJS Es moudule AMD等模块类型
  • webpack4支持零配置使用,但很弱

3.2 准备执行构建

  • 新建src⽂件夹
  • 新建src/index.js、src/index.json、src/other.js
// index.js
const json = require("./index.json");//commonJS
import { add } from "./other.js";//es module
console.log(json, add(2, 3));
// index.json
{
"name": "JOSN"
}
// other.js
export function add(n1, n2) {
return n1 + n2;
}

3.3 执行构建

  • 修改package.json
"scripts": {
    "test": "webpack"
  },
# npx 方式
npx webpack

# npm script
npm run test

原理就是通过shell脚本在node_modules/.bin⽬录下创建⼀个软链接。

3.4 构建成功

我们会发现目录下多出一个dist目录, 里面有个main.js,这个文件是可执行的JavaScript文件,里面包含webpackBootstrap启动函数。

3.5 默认配置

const path = require('path')
module.exports = {
    // webpack 执行构建入口文件
    entry:'./src/index.js',
    output:{
        // 将所有依赖的模块合并输出到main.js
        filename:'main.js',
        // 输出⽂件的存放路径,必须是绝对路径
        path: path.resolve(__dirname,'dist')
    },
}

4.webpack配置核心概念

4.1 配置文件

webpack有默认的配置⽂件,叫 webpack.config.js,我们可以对这个⽂件进⾏修改,进⾏个性化配置。当然我们也可以自定义配置文件,比如webpack.js,可以通过--config webpack.js来指定webpack使用这个配置文件来执行构建。

webpack.config.js配置基础结构

module.exports = {
  entry: "./src/index.js", //打包⼊⼝⽂件
  output: "./dist", //输出结构
  mode: "production", //打包环境
  module: {
    rules: [
      //loader模块处理
      {
        test: /\.css$/,
        use: "style-loader",
      },
    ],
  },
  plugins: [new HtmlWebpackPlugin()], //插件配置
};

4.2 entry

指定webpack打包入口文件

#单入口 SPA,本质是个字符串
entry:{
    main: './src/index.js'
}
# 简写
entry:'./src/index.js'

# 多入口 entry是个对象
entry:{
    index:'./src/index.js',
    login:'./src/login.js'
}

4.3 output

指定打包后输出的目录

output:{
    filename:'bundle.js', // 输出文件的名称
    path: path.resolve(__dirname, 'dist') // 输出目录,必须是绝对路径
}

4.4 mode

用来指定当前的构建环境,有三个值:

  • development
  • production
  • none

设置mode可以自动触发webpack的内置函数,达到优化的效果


开发阶段的开启会有利于热更新的处理,识别哪个模块变化
⽣产阶段的开启会有帮助模块压缩,处理副作⽤等⼀些功能

4.5 loader

模块解析,模块转换器,用于把模块原内容按照需求转换为新内容。
webpack是模块打包工具,而模块不仅仅是js,还可以是css,图片等。但是webpack默认只知道如何处理js和json模块,那么其他格式的模块就得依赖loader了。

常见的loader
style-loader
css-loader
less-loader
sass-loader
ts-loader //将Ts转换成js
babel-loader//转换ES6、7等js新特性语法
file-loader//处理图⽚⼦图
eslint-loader

4.6 module

模块,在webpack里一切皆模块,一个模块对应一个文件。webpack构建时,会先从配置的entry开始递归找出所有的模块,当遇到不认识的模块时,需要在webpack的module进行配置,检测到是什么格式的模块,就用对应的loader处理。

module:{
    rules:[
        {
            test:/\.xxx$/,  // 指定匹配规则
            use:{
                loader:'xxx-loader' //指定使用的loader
            }
        }
    ]
}

4.7 plugins

plugin可以在webpack执行到某个阶段的时候,帮你做一些事情。原理是在webpack构建流程中的特定时机注入扩展逻辑来改变构建结果,作用于整个构建过程。

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