认识Webpack概念

本篇文章旨在让同窗们了解Webpack的基本概念和使用方法。讲解的也会浅显易懂。javascript

前言

在前端模块化开发的今天,咱们在工做中常常会接触到一些编译构建工具,如Parcel(极速零配置Web应用打包工具),Rollup(新一代JavaScript模块打包器),Gulp(基于流的自动化构建工具),Webpack(JavaScript应用程序的静态模块打包工具)等等。这其中Webpack是用户量最庞大的一个。咱们在开发VueReact项目的时候都会接触到Webpack的配置状况。因此学好这项技术对咱们的前端发展是有帮助的。css

概念

本质上,Webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。当 Webpack处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个bundlehtml

在开始学习以前,咱们先理解四个核心概念前端

  • entry(入口)
  • output(输出)
  • loader
  • plugins(插件)
module.exports = {
    entry:'./index',
    // webpack打包入口文件
    output: {
        path: path.resolve(__dirname, "dist"), // string
        // 全部输出文件的目标路径
        filename: "[chunkhash].js", // string
        // 输出的文件名称
        publicPath: "/assets/", // string
        // 构建文件的输出目录,可不输入。
    },
    module: {
        rules: [
            {
                test: /\.js$/, // RegExp | string
                loader: 'babel-loader', // 模块上下文解析
                include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]  // 和test同样,必须匹配选项
           }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: './dist/index.html', // 将HTML写入的文件。默认为index.html
            template: 'index.html', // webpack模板的相对或绝对路径
            inject: true, // true'body'全部javascript资源都将放置在body元素的底部。'head'会将脚本放置在head元素中
            minify: { // 控制是否以及以何种方式最小化输出
                removeComments: true,
                collapseWhitespace: true,
                removeAttributeQuotes: true
                // ...
            },
            // necessary to consistently work with multiple chunks via CommonsChunkPlugin
            chunksSortMode: 'dependency'
        })
    ]
}
复制代码

核心概念

1.entry

单入口写法:entry: string | Array<string>java

module.exports = {
    entry: './src/index.js'
}
复制代码

多入口写法:entry: {[entryChunkName]: string} | Array<string>node

module.exports = {
    entry: {
        app: './src/app.js',
        admin: './src/admin.js'
    }
}
复制代码

2.oupput

配置output选项能够控制webpack如何向硬盘写入编译文件。注意,即便能够存在多个入口起点,但只指定一个输出配置。webpack

webpack中配置output属性的最低要求是,将它的值设置为一个对象,包括如下两点:web

  • filename 用于输出文件的文件名。
  • 目标输出目录 path 的绝对路径。
module.exports = {
    output: {
        filename: 'bundle.js',
        path: __dirname + '/dist'
    }
}
复制代码

若是是多入口,output 的写法可使用占位符(substitutions)来确保每一个文件具备惟一的名称。npm

module.exports = {
    entry: {
        app: './src/app.js',
        admin: './src/admin.js'
    },
    output: {
        filename: '[name].js',
        path: __dirname + '/dist'
    }
}
复制代码

3.loaders

咱们先理解一下概念:loader用于对模块的源代码进行转换。loader可使你在import或"加载"模块时预处理文件。所以loader相似于其余构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader能够将文件从不一样的语言(如 TypeScript)转换为JavaScript,或将内联图像转换为 data URLloader甚至容许你直接在JavaScript模块中 import CSS文件!bash

module.exports = {
    entry: './src/index.js' ,
    output: {
        filename: '[name].js',
        path: __dirname + '/dist'
    },
    module: {
        rules: [
            {
                test: /.less$/, // 匹配使用此loader的文件
                use: [  // 使用的loader名称
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
            {
                test: /.(png|jpg|gif|jpeg)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 10240
                        }
                    }
                ]
            }
        ]
    }
}

复制代码

经常使用的loaders包括:

名称 描述
babel-loader 转换ES5,ES6,ES7等JS新特性语法
style-loader 将模块导出做为样式添加到DOM
css-loader 用解析后的导入加载CSS文件并返回CSS代码
less-loader 将LESS文件编译为CSS文件
ts-loader 将TS代码转换为JS代码
file-loader 将文件打包进对应的目录,并返回相对的地址
url-loader 相似file-loader,若是文件小于限制的大小,能够返回数据的DataURL

4.plugins

插件用于打包文件的优化,资源管理和环境变量的注入。做用于整个构建过程。插件的目的在于解决loader没法实现的其它事情

const HtmlWebpackPlugin = require('html-webpack-plugin'); //经过 npm 安装
const webpack = require('webpack'); //访问内置的插件

module.exports = {
    entry: './src/index.js' ,
    output: {
        filename: '[name].js',
        path: __dirname + '/dist'
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/, 
                use: [  
                    'babel-loader',
                ]
            }
        ]
    },
    plugins: [
        new webpack.optimize.UglifyJsPlugin(),
        new HtmlWebpackPlugin({template: './src/index.html'})
    ]
}
复制代码

经常使用的plugins包括:

名称 描述
CommonsChunkPlugin 将chunks相同的代码提取成公共js
cleanWebpackPlugin 清理构建的目录
HtmlWebpackPlugin 建立html文件去承载你build后的js
UglifyjsWebpackPlugin 插件使用uglify-js来压缩代码
HotModuleReplacementPlugin 启用热更新模块,也就是HMR
DllPlugin 为了极大减小构建时间,进行分离打包
ZipWebpackPlugin 将打出的资源生成一个zip包
TerserPlugin

5.mode

mode用来指定当前的构建环境是:productiondevelopment,或者是none。 设置mode可使⽤webpack内置的函数,其默认值为production

选项 描述
production 设置process.env.NODE_ENV的值为production,启用FlagDependencyUsagePlugin,FlagIncludedChunksPlugin,ModuleConcatenationPlugin,NoEmitOnErrorsPlugin,OccurrenceOrderPlugin,SideEffectsFlagPluginTerserPlugin
development 设置process.env.NODE_ENV的值为development,启用NamedChunksPluginNamedModulesPlugin
none 不开启任何优化选项

6.热更新机制

module.exports = {
    ... ,
     devServer: {
        contentBase: './dist',
        hot: true
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin()
    ]
}
复制代码

总结

这里介绍了Webpack的入门实践。但愿能够帮助到你们理解相关的概念。最近看知乎看到一句话挺有意思的。分享一下,原话是:“计算机教会我不少原理,我却用它来更好的生活”。

相关文章
相关标签/搜索