webpack概念以及配置文件详解

Webpack 概念

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

模块(Modules):
在模块化编程中,将程序分解成离散功能模块(discrete chunks of functionality)。
每个模块具有比完整程序更小的接触面,使得校验、调试、测试轻而易举。精心编写的模块提供了可靠的抽象和封装界限,使得应用程序中每个模块都具有条理清楚的设计和明确的目的。


webpack 模块:
webpack 模块能够以各种方式表达它们3的依赖关系,例如:
ES2015 import语句
CommonJs require()语句
AMD definerequire 语句
css/sass/less 文件中的 @import 语句
样式(url(...))或 HTML 文件(<img src=...>)中的图片链接(image url)
webpack 1 需要特定的 loader 来转换 ES 2015 import,然而通过 webpack 2 可以开箱即用。


webpack 支持的模块类型:
webpack 通过 loader 可以支持各种语言和预处理器编写模块。loader 描述了 webpack 如何处理非 JavaScript(non-JavaScript)模块,并且在 bundle 中引入这些依赖。

webpack是高度可配置的,但是必须先理解4个核心概念:

一、入口(entry):入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后, webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。* 每个依赖项随即被处理,最后输出到称之为 bundles 的文件中。*

    //可以通过在 webpack.config.js 文件中配置 entry 属性,来指定一个入口起点:
    module.exports = {
        entry : './path/to/my/entry/files.js'
    }

更多使用方法查询:https://doc.webpack-china.org/concepts/entry-points

二、 输出(output):告诉 webpack 在哪里输出它所创建的 bundles ,以及如何命名这些文件。

    module.exports = {
        output: {
             path       : './dist',
             //按需加载(on-demand-load)或加载外部资源(external resources)(如图片、文件等)
             publicPath : '/dist', 
             filename   : 'js/[name].js'
        }
    }

代码解释:
1.通过 output.filenameoutput.path属性,来告诉 webpack bundle 的名称,以及我们想要生成(emit)到哪里。
2.更多属性请查询:https://doc.webpack-china.org/configuration/output

三、loader:让 webpack 能够处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后就可以利用 webpack 的打包能力,对它们进行处理。

loader 用于对模块的源代码进行转换。loader 可以使你在import或“加载”模块时预处理文件。因此,loader 类似于其他构建工具中”任务(task)”,并提供了处理前端构建步骤的强大办法。loader 可以将文件从不同的语言转换为 JavaScript ,或将内联图像转换为 data URL. loader 甚至允许你直接在 JavaScript 模块中 import CSS 文件。

使用方法查阅:https://doc.webpack-china.org/concepts/loaders
四、 插件(plugins):插件的目的在于解决 loader 无法实现的其他事。

webpack 插件是一个具有 apply属性的 JavaScript 对象。apply属性会被webpack compiler 调用,并且 compiler 对象可在整个编译生命周期访问。


Function.prototype.apply:通过这个方法可以把任意函数作为插件传递(this将指向compiler)。
具体用法请查阅:https://doc.webpack-china.org/concepts/plugins

完整的 webpack 配置文件实例(webpack 1.X)

var webpack                      = require('webpack');
var ExtractTextPlugin            = require("extract-text-webpack-plugin");
var HtmlWebpackPlugin            = require('html-webpack-plugin');

//环境变量配置,dev / online
var WEBPACK_ENV              = process.env.WEBPACK_ENV || 'dev';
console.log(WEBPACK_ENV);

//获取html-webpack-plugin的参数的方法
var getHtmlConfig=function(name,title){
    return {
        template       : './src/view/' + name + '.html',
        filename       : 'view/' + name + '.html',
        title          : title,
        inject         : true,
        hash           : true,
        chunks         : ['common',name]
    };
};

//webpack config
var config ={
    //多个入口配置
     entry : {
        'common'              : ['./src/page/common/index.js','webpack-dev-server/client?http://localhost:8088/'],
        'index'               : ['./src/page/index/index.js'],
        'list'                : ['./src/page/list/index.js'],
        'detail'              : ['./src/page/detail/index.js'],
        'cart'                : ['./src/page/cart/index.js'],
        'order-confirm'       : ['./src/page/order-confirm/index.js'],
        'order-list'          : ['./src/page/order-list/index.js'],
        'order-detail'        : ['./src/page/order-detail/index.js'],
        'payment'             : ['./src/page/payment/index.js'],
        'user-login'          : ['./src/page/user-login/index.js'],
        'user-register'       : ['./src/page/user-register/index.js'],
        'user-pass-reset'     : ['./src/page/user-pass-reset/index.js'],
        'user-center'         : ['./src/page/user-center/index.js'],
        'user-center-update'  : ['./src/page/user-center-update/index.js'],
        'user-pass-update'    : ['./src/page/user-pass-update/index.js'],
        'result'              : ['./src/page/result/index.js'],
     },
     //output
     output : {
         path       : './dist',
         publicPath : '/dist',
         filename   : 'js/[name].js'
     },
     /*防止将某些 import 的包(package)打包到 bundle 中,
     而是在运行时(runtime)再去从外部获取这些扩展依赖*/
     externals : {
            'jquery' : 'window.jQuery'
     },
     //loaders
     module : {
            loaders : [
                { test : /\.css$/, loader:ExtractTextPlugin.extract("style-loader","css-loader")},
                { test : /\.(gif|png|jpg|woff|svg|eot|ttf)\??.*$/, loader:"url-loader?limit=100&name=resource/[name].[ext]"},
                {
                    test   : /\.string$/,
                    loader : 'html-loader',
                    query  : {
                        minimize : true,
                        removeAttributeQuotes : false
                    }
                }
            ]
     },
    //解析
    resolve : {
        //创建 import 或 require 的别名,来确保模块引入变得更简单。
        alias : {
            node_modules    : __dirname + '/node_modules',
            util            : __dirname + '/src/util',
            page            : __dirname + '/src/page',
            service         : __dirname + '/src/service',
            image           : __dirname + '/src/image'
        }
    },
    //插件
     plugins : [
            //独立通用模块到js/base.js
            new webpack.optimize.CommonsChunkPlugin({
                name : 'common',
                filename : 'js/base.js'
            }),
            //把css单独打包到文件里
            new ExtractTextPlugin("css/[name].css"),
            //html模板的处理
            new HtmlWebpackPlugin(getHtmlConfig('index','首页')),
            new HtmlWebpackPlugin(getHtmlConfig('list','商品列表')),
            new HtmlWebpackPlugin(getHtmlConfig('detail','商品详情')),
            new HtmlWebpackPlugin(getHtmlConfig('cart','购物车')),
            new HtmlWebpackPlugin(getHtmlConfig('order-confirm','订单确认')),
            new HtmlWebpackPlugin(getHtmlConfig('order-list','订单列表')),
            new HtmlWebpackPlugin(getHtmlConfig('order-detail','订单详情')),
            new HtmlWebpackPlugin(getHtmlConfig('payment','订单支付')),
            new HtmlWebpackPlugin(getHtmlConfig('user-login','用户登录')),
            new HtmlWebpackPlugin(getHtmlConfig('user-register','用户注册')),
            new HtmlWebpackPlugin(getHtmlConfig('user-pass-reset','找回密码')),
            new HtmlWebpackPlugin(getHtmlConfig('user-center','个人中心')),
            new HtmlWebpackPlugin(getHtmlConfig('user-center-update','修改个人信息')),
            new HtmlWebpackPlugin(getHtmlConfig('user-pass-update','修改密码')),
            new HtmlWebpackPlugin(getHtmlConfig('result','操作结果')),
     ]
   };

   if('dev' === WEBPACK_ENV){
    config.entry.common.push('webpack-dev-server/client?http://localhost:8088/');
   }

  module.exports = config;

更多配置内容请查看:https://doc.webpack-china.org/configuration/

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Webpack配置文件通常命名为`webpack.config.js`,它需要导出一个包含Webpack配置信息的JavaScript对象。以下是一个基本的Webpack配置文件示例: ```javascript const path = require('path'); module.exports = { // 入口文件 entry: './src/index.js', // 输出文件 output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, // 模块处理规则 module: { rules: [ // 处理.js文件 { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'] } } } ] } }; ``` 上述示例中,我们定义了一个入口文件`src/index.js`,一个输出文件`dist/bundle.js`,以及一个用于处理.js文件的规则,它使用了babel-loader和@babel/preset-env。在实际使用中,你可能需要根据具体情况进行调整。 ### 回答2: webpack配置文件是一个名为webpack.config.js的JavaScript文件,用于指定webpack的打包规则和插件配置。通过对webpack.config.js的配置,可以实现对项目的模块打包、代码转译、优化等操作。 在webpack.config.js中,需要导出一个配置对象,其中包含一些常用的配置项。以下是一些常见的配置项: entry:指定项目的入口文件,用于指定webpack从哪个文件开始打包。 output:用于配置打包后的输出文件的名称和路径。 module:用于配置不同类型模块的加载器。比如,可以使用babel-loader来处理JS文件的转译,使用css-loader和style-loader来处理CSS文件的导入和样式注入等。 plugins:用于配置webpack的插件。比如,可以使用HtmlWebpackPlugin来自动生成HTML文件,使用UglifyJsPlugin来压缩JS代码等。 resolve:用于配置模块路径的解析规则。比如,可以指定webpack优先使用哪种文件扩展名来匹配模块。 devServer:用于配置开发服务器的行为。比如,可以指定服务器的端口号、代理配置、是否启用热模块替换等。 以上只是一些常用的配置项,webpack配置文件还有很多其他的选项可以根据项目需求进行配置。 要使用webpack配置文件,只需在命令行中运行webpack命令,并将配置文件作为参数传递,例如:webpack --config webpack.config.js。 ### 回答3: Webpack配置文件是用于定义和配置Webpack工具的文件,它通常以webpack.config.js命名,并位于项目根目录下。Webpack是一个模块打包工具,可以将各种类型的资源文件进行打包和优化,使其能够在浏览器中运行。 Webpack配置文件主要包含一些配置项和规则,用于定义打包规则如何处理不同类型的文件,以及如何优化打包输出结果。 在配置文件中,我们可以定义入口文件(entry)和输出文件(output),用于指定打包的入口和输出的文件路径。可以使用loader来对各种类型的资源文件进行处理,如ES6语法转换、CSS预处理、图片压缩等。还可以使用插件(plugins)来扩展Webpack的功能,如提取CSS文件、自动生成HTML文件等。 配置文件中的其他配置项还包括模式(mode),用于指定打包的模式,如开发模式(development)或生产模式(production);devServer配置用于配置开发服务器,以便在开发过程中实时预览项目;resolve配置用于配置模块解析规则,如设置别名、指定模块的查找路径等。 在配置文件中,我们可以编写一些自定义逻辑来实现特定的需求,例如根据环境变量配置不同的打包策略,动态生成入口文件等。 总之,Webpack配置文件是一个用于定义和配置Webpack工具的文件,通过对配置项、规则、插件等进行编写和配置,可以实现各种资源的打包和优化,使项目在浏览器中能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值