WebPack

一、Webpack和gulp/grunt对比

1、Gulp和Grunt

Grunt和Gulp的工作方式是:在一个配置文件中,指明对某些文件进行类似编 译,组合,压缩等任务的具体步骤,工具之后可以自动替你完成这些任务。

Grunt 弊端:

是基于文件流的(读到内存,替换),随着项目膨胀,会越来越慢,越来越复杂。

Gulp:

实现了grunt一样的功能。

优点:

  • 基于流式的。

不是通过目录去复制每一个文件。直接处理二进制。

  • 配置简单。

缺点:满足不了前端发展的需求:懒加载,模块拆分,react中trunk的。 

2、webpack

Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件 (如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件 ,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaSc ript文件。

 

 

Grunt和Gulp:任务管理器。——前端自动化

WebPack:模块打包器。

无法替代的优势:工程化和模块化。 

二、WebPack使用

GitHub 

https://webpack.js.org/

安装:

pm i -D webpack@3.10.0

sudo npm i -D webpack@3.10.0 --registry=https://registry.npm.taobao.org

webpack.config.js用的是commonjs的模块式语法。【webpack4.0之后可以不用配:webpack.config.js】

可以直接加上哈希。

const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle-[hash].js'
  }
};

每次生成的文件不一样。

两个模块合并压缩生成了一个文件,文件中加入了webpack的模块管理语法。

执行:

webpack

webpack webpack.config.js 

 

真正开发中,会建一个文件夹,全部配置写到config文件夹中。

const path = require('path');

const version=require('./version');

module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle-[hash].js'
  }
};

 

学习资料推荐:

入门Webpack,看这篇就够了

 

https://webpack.js.org/concepts/

三大功能:

  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          { loader: 'style-loader' },
          {
            loader: 'css-loader',
            options: {
              modules: true
            }
          }
        ]
      }
    ]
  }

热加载机制,借助插件API

 

常规的webpack配置实现参考

webpack.config.js

const path = require('path');
const HTMLPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const ExtractPlugin = require('extract-text-webpack-plugin');

const isDev = process.env.NODE_ENV === 'development';

const config = {
    target: 'web',
    entry: path.join(__dirname, 'src/index.js'),   // 输入:项目主文件(入口文件)
    output: {       // 输出
        filename: 'build.[hash:8].js',  // 输出的文件名
        path: path.join(__dirname, 'dist')  // 输出路径
    },
    module: {       // 配置加载资源
        rules: [    // 规则
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.jsx$/,
                loader: 'babel-loader'
            },
            {
                test: /\.(gif|jpg|jpeg|png|svg)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 1024,  // 文件小于1024字节,转换成base64编码,写入文件里面
                            name: '[name]-output.[ext]'
                        }
                    }
                ]
            }
        ]
    },
    // webpack插件配置
    plugins: [
        new webpack.DefinePlugin({
            'process.env': {
                NODE_ENV: isDev ? '"development"' : '"production"'
            }
        }),
        new HTMLPlugin()
    ]
};

if (isDev) {
    // 开发坏境的配置
    config.module.rules.push({
        test: /\.styl/,
        use: [
            'style-loader',
            'css-loader',
            {
                loader: 'postcss-loader',
                options: {
                    sourceMap: true
                }
            },
            'stylus-loader'
        ]
    });
    config.devtool = '#cheap-module-eval-source-map';
    config.devServer = {
        port: '8888',
        host: '127.0.0.1',
        overlay: {  // webpack编译出现错误,则显示到网页上
            errors: true,
        },
        // open: true,

        // 不刷新热加载数据
        hot: true
    };
    config.plugins.push(
        new webpack.HotModuleReplacementPlugin(),
        new webpack.NoEmitOnErrorsPlugin()
    )
} else {
    // 生成坏境的配置
    config.entry = {   // 将所用到的类库单独打包
        app: path.join(__dirname, 'src/index.js'),
        vendor: ['vue']
    };
    config.output.filename = '[name].[chunkhash:8].js';
    config.module.rules.push({
        test: /\.styl/,
        use: ExtractPlugin.extract({
            fallback: 'style-loader',
            use: [
                'css-loader',
                {
                    loader: 'postcss-loader',
                    options: {
                        sourceMap: true
                    }
                },
                'stylus-loader'
            ]
        })
    });
    config.plugins.push(
        new ExtractPlugin('styles.[contentHash:8].css'),

        // // 将类库文件单独打包出来
        // new webpack.optimize.CommonsChunkPlugin({
        //     name: 'vendor'
        // })

        // webpack相关的代码单独打包
        // new webpack.optimize.CommonsChunkPlugin({
        //     name: 'runtime'
        // })
    );

    config.optimization = {
        splitChunks: {
            cacheGroups: {                  // 这里开始设置缓存的 chunks
                commons: {
                    chunks: 'initial',      // 必须三选一: "initial" | "all" | "async"(默认就是异步)
                    minSize: 0,             // 最小尺寸,默认0,
                    minChunks: 2,           // 最小 chunk ,默认1
                    maxInitialRequests: 5   // 最大初始化请求书,默认1
                },
                vendor: {
                    test: /node_modules/,   // 正则规则验证,如果符合就提取 chunk
                    chunks: 'initial',      // 必须三选一: "initial" | "all" | "async"(默认就是异步)
                    name: 'vendor',         // 要缓存的 分隔出来的 chunk 名称
                    priority: 10,           // 缓存组优先级
                    enforce: true
                }
            }
        },
        runtimeChunk: true
    }


}

module.exports = config;
View Code

 

不推荐:

webpack --module-bind jade-loader --module-bind 'css=style-loader!css-loader'

全局安装问题:

不同的工程用不同的版本。有些配置上的差别,建议本地安装。

npm install --save-dev webpack

直接运行webpack遇到的问题: 

$ webpack webpack.config.js
bash: webpack: command not found

node_modules/.bin/webpack

我一般都是自定义shell命令来操作的。

alias lwebpack="node_modules/.bin/webpack"

 

 

本文作者starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:https://www.cnblogs.com/starof/p/9062560.html 有问题欢迎与我讨论,共同进步。

posted @ 2018-05-24 08:57  starof  阅读(364)  评论(0编辑  收藏  举报