初识webpack4.0

概念

webpack本质是javaScript(以下简称js)应用的静态打包工具,基本过程是在内部构建一个依赖图(dependency graph),用于映射项目所需的每个模块,并生成对应的bundle。

模式

module.exports = {
  /* 默认是production, 可根据环境自行判断 */
  mode: isProd ? 'production' : 'development',
}

入口

入口用于指定webpack应该使用那个模块来开始构建内部的依赖图,编译找出哪些模块和库是直接还是间接有依赖关系,其默认值./src/index.js,也可通过项目的配置文件(webpack.config.js, 项目根目录处中,webpack会默认使用改文件配置)中指定入口:

module.exports = {
  mode: isProd ? 'production' : 'development',
  /* 入口可以为多个,用数组表示 */
  entry: './view/src/index.js'
}

输出

output 指定bundle文件的创建路径和命名,默认是在./dist/main.js,也可通过output字段进行自定义,如下:

const path = require('path');

module.exports = {
  mode: isProd ? 'production' : 'development',
  entry: './view/src/index.js'
  output: {
    path: path.resolve(_dirname, 'public'), // _dirname是指当前模块或文件的目录名称
    filename: '[name]-[chunkhash:8].js'
  }
}

loader

loader可以称作加载器或者资源转化器,因为webpack本身只能打包js和json的文件资源,loader就应运而生了,实质是一个函数,接受源文件作为参数,返回转换或预处理的结果,使得webpack可以正常打包,loader的使用方式有三种:

  • 配置(推荐): 在webpack.config.js中配置,可全局使用
  • 内联:在每个import或等同于import 的语句中显示指定loader
  • CLI:在可视化终端或shell命令中指定

方式一:在配置文件中对不同后缀的文件选择不同的loader,简单如下:

const path = require('path');

module.exports = {
  mode: isProd ? 'production' : 'development',
  entry: './view/src/index.js'
  output: {
    path: path.resolve(_dirname, 'public'), // _dirname是指当前模块或文件的目录名称
    filename: '[name]-[chunkhash:8].js'
  },
/*
rules里的对象test和use属性是必须的,表示在遇到正则匹配的文件时,先用对应的 loader转换
*/
  module: {
    rules: [
       { test: /\.jsx?$/, use: 'happypack/loader' },
       { test: /\.(less|css)$/, use: [ { loader: 'css-loader }, { loader: 'less-loader' } ] },
    ]
  }
}

方式二:内联表达

/* 使用 !将不同的loader分开,每个loader都是基于当前目录解析 */
  import Styles from 'style-loader!css-loader?modules!./styles.css';

方式三: CLI

/* 同样使用 !将不同的loader分开,表示jade文件使用jade-loader,css文件使用style-loader和css-loader */
  webpack --module-bind jade-loader --module-bind 'css=style-loader!css-loader'

再看一下loader的一些特性,如下

  • 链式传递 :可对资源使用流水线操作(pipeline)
  • 支持同步或异步
  • 可接收查询参数: 用于对loader进行传递配置
  • loader会产生额外文件

plugin

plugin 是在loader不能满足需求的情况下引入的插件,实质是一个对象,可通过new操作来创建实例,用来扩展业务,而且在整个生命周期起作用,示例如下:

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

module.exports = {
  mode: isProd ? 'production' : 'development',
  entry: './view/src/index.js'
  output: {
    path: path.resolve(_dirname, 'public'), // _dirname是指当前模块或文件的目录名称
    filename: '[name]-[chunkhash:8].js'
  },
/*
rules里的对象test和use属性是必须的,表示在遇到正则匹配的文件时,先用对应的 loader转换
*/
  module: {
    rules: [
       { test: /\.jsx?$/, use: 'happypack/loader' },
       { test: /\.(less|css)$/,
          use: [
             { loader: 'css-loader' },
             { loader: 'less-loader' },
          ]
        },
    ],
  },
  /* html-webpack-plugin 把webpack打包的文件都自动插入到html文件中*/
  plugins: [
    new HtmlWebpackPlugin({ template: './src/index.html' })
  ],
}

plugin是具有<code>apply</code>属性的js对象,而且apply可被webpack compiler 调用,compiler对象可在整个的编译周期被访问

// 定义常量,便于在其他hook中服用
const pluginName = 'ConsoleLogOnBuildWebpackPlugin';

class ConsoleLogOnBuildWebpackPlugin {
    apply(compiler) {
        compiler.hooks.run.tap(pluginName, compilation => {
            console.log("webpack 构建过程开始!");
        });
    }
}

devtool

该选项控制是否&如何生成source map,不同的值会影响构建和重新构建的速度,详细的看文档

module.exports = {
  devtool: isProd ? '' : 'source-map',
}

配置

webpack配置是标准的Node.js CommonJs模块,实质是导出一个对象的JavaScript文件,可自定义对象的属性,其中可包括:

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