美文网首页
初识webpack4.0

初识webpack4.0

作者: 小样_简书 | 来源:发表于2020-07-06 14:28 被阅读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的一些基本配置项

相关文章

网友评论

      本文标题:初识webpack4.0

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