webpack学习笔记(一) 核心概念

这篇文章咱们先来简单看看 webpack 中几个的核心概念,并粗略学习一下配置文件的写法javascript

一、mode

在 webpack 中有两种常见的模式,一种是 development(开发模式),一种是 production(生产模式)css

两种模式下都有对应的 webpack 内置优化html

  • 在 development 模式下,process.env.NODE_ENV 的值将被设置为 development
// webpack.development.config.js

module.exports = {
    mode: 'development'
}
  • 在 production 模式下,process.env.NODE_ENV 的值将被设置为 production
// webpack.production.config.js

module.exports = {
    mode: 'production'
}

二、entry

entry 是 webpack 构建模块依赖图的起点java

webpack 会递归地寻找这个入口文件依赖的全部模块,并根据这些依赖关系构建出一个模块依赖图webpack

// webpack.config.js
// 单个入口文件的简写语法

module.exports = {
    entry: './src/index.js' // entry 属性指定入口文件路径
};

咱们还能指定多个入口文件(这是一种可拓展的方式)web

对于每一个入口文件,webpack 都会构建一个模块依赖图,这些依赖图是彼此分离、相互独立的正则表达式

// webpack.config.js
// 多个入口文件的对象语法

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

三、output

output 是 webpack 打包以后输出的文件npm

当 webpack 对一个入口文件构建好模块依赖图后,它会将全部模块打包成一个或多个文件输出数组

// webpack.config.js

module.exports = {
    entry: './src/index.js',
    output: { // output 属性指定打包以后的文件放在什么位置
        // filename 属性指定输出文件的文件名称
        filename: 'bundle.js',
        // path 属性指定输出目录的绝对路径
        path: '/dist'
    }
};

对于多个入口文件状况,output 也只能指定一个输出配置babel

此时应该使用 占位符 来确保每一个文件具备惟一的名称

// webpack.config.js

module.exports = {
    entry: {
        app: './src/app.js',
        search: './src/vendors.js'
    },
    output: {
        filename: '[name].js',
        path: __dirname + '/dist'
    }
}

四、loader

loader 用于对模块的源代码进行转换

由于 webpack 只能理解 JavaScript,因此须要 loader 将其它类型的文件转化为 webpack 可以处理的有效模块

不一样的 loader 完成不一样的任务,下面的例子指定使用 style-loader 和 css-loader 处理 CSS 文件

// webpack.config.js

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: '/dist'
    },
    module: {
        // rules 属性用于定义处理规则
        // 它是一个数组,其中的每个项是一个对象,定义一条处理规则
        rules: [
            {
                // test 属性用于标识应该处理哪些文件
                // 它能够是一个正则表达式
                test: /\.css$/,
                // use 属性用于指定应该使用哪些 loader
                // 它是一个数组,其中的每个项是一个对象,指定一个 loader
                use: [
                    {
                        // 须要安装 style-loader
                        // npm install --save-dev style-loader
                        loader: 'style-loader'
                    },
                    {
                        // 须要安装 css-loader
                        // npm install --save-dev css-loader
                        loader: 'css-loader',
                        options: { // options 属性用于传入额外的配置
                            modules: true
                        }
                    }
                ]
            }
        ]
    }
}

五、plugin

plugin 用于处理一些拓展任务,从打包优化和压缩,一直到从新定义环境中的变量

// webpack.config.js

// 内置插件
const webpack = require('webpack')
// 外部插件,须要经过 npm 安装
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: '/dist'
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                use: 'babel-loader'
            }
        ]
    },
    plugins: [
        // 因为插件能够携带参数,因此咱们须要传入一个 new 实例
        new webpack.optimize.UglifyJsPlugin(),
        new HtmlWebpackPlugin({template: './src/index.html'})
    ]
}

【 阅读更多 webpack 系列文章,请看 webpack学习笔记