美文网首页
为何使用 webpack

为何使用 webpack

作者: 许道龙 | 来源:发表于2017-04-12 09:42 被阅读0次

    webpack 是一个构建工具,针对各种静态文件进行依赖、压缩(图片转Base64格式)、解析(Scss-Less-TypeScript 引擎)、合并等等自动化操作。

    webpack 的各种插件可以直接应对各种场景,能使前端开发流程化,只需要一开始配置好脚本就可以.

    入门教程:
    Webpack 指南 :
    https://zhuanlan.zhihu.com/p/20367175
    https://zhuanlan.zhihu.com/p/20397902
    https://zhuanlan.zhihu.com/p/20522487 --> React配合开发

    下面罗列 webpack 能够解决大型开发遇到的问题 :

    文件依赖. 部署前置处理.

    依赖

    早期我们通过 特定的顺序 来进行安排 Javascript 、CSS 依赖关系.

    <script src="jquery.min.js"></script>  
    <script src="jquery.some.plugin.js"></script>  
    <script src="index.js"></script>  
    
    

    导致的问题:

    • http请求过多
    • 过多的全局变量模糊等

    解决方法
    使用CommonJS 或者 ES6 模块 , 或者使用 RequireJs

    // Version.js
    module.exports = { version: 1.0 };  
    
    // App.js
    var config = require('./Version.js');   // require 不能在浏览器中直接使用,需要Babel,这都是打包过程
    console.log('App Version:', config.version);  
    
    

    压缩

    举个例子:针对某些低于一定的大小的图片文件,可以通过 配置 转化Base64 格式.

    按需加载

    需要用到的资源才会http请求.

    常用的开发版本配置文件如下

    /**
     * 该文件名- webpackDevConf.js
     * 编码作者- 许道龙
     * 创建日期- 2017/1/3 09:23
     * 作者邮箱- xudaolong@vip.qq.com
     * 作者博客- http://xudaolong.github.io/
     * 修改时间-
     * 修改备注-
     * 编码内容-
     */
    
    const path = require('path');
    const {resolve} = require('path');
    const {existsSync}= require('fs');
    const webpack = require('webpack');
    
    // plugin
    const HtmlWepackPlugin = require('html-webpack-plugin');
    const Visualizer = require('webpack-visualizer-plugin');
    const ExtractTextPlugin = require("extract-text-webpack-plugin");
    
    // path
    const rootPath = path.resolve(__dirname);
    const webPath = path.resolve(rootPath, '../../web');
    const ThemePath = path.resolve(rootPath, '../../web/utils/antdTheme.js');
    const buildPath = path.resolve(rootPath, '../../web/build');
    const nodeModules = path.join(__dirname, '../../node_modules');
    
    module.exports = {
        entry: [
            'babel-polyfill',
            'react', // Include this to enforce order
            'react-dom', // Include this to enforce order,
            './web/index.web.jsx'
        ],
        output: {
            path: buildPath,
            filename: '[name].[hash].v1.0.0.js',
            publicPath: '/',
            chunkFilename: '[name].chunk.js'
        },
        //resolve path
        resolve: {
            modulesDirectories: ['node_modules', nodeModules],
            extensions: ['', '.web.tsx', '.web.ts', '.web.jsx', '.web.js', '.ts', '.tsx', '.js', '.jsx', '.json'],
        },
        module: {
            loaders: [
                // jsx
                {
                    test: /(\.js|\.jsx)$/,
                    exclude: /(node_modules|bower_components)/,
                    loader: 'babel',
                    // include: webPath,
                    query: {
                        cacheDirectory: true,
                        presets: [
                            ['react'],
                            ["es2015"],
                            ['stage-0']],
                        //transform-class-properties:支持es6 static
                        plugins: ["transform-class-properties", ["import", {"libraryName": "antd", "style": true}]]
                    }
                },
                // css
                {
                    test: /\.css$/,
                    loaders: ['style', 'css']
                },
                // less
                {
                    test: /\.less$/,
                    loaders: [
                        'style-loader',
                        'css-loader',
                        'postcss',
                        `less-loader?{"sourceMap":true,"modifyVars":${JSON.stringify(require(ThemePath)())}}`
                    ],
                },
                // Boootstrap font image loader
                {
                    test: /\.woff($|\?)|\.woff2($|\?)|\.ttf($|\?)|\.eot($|\?)|\.svg($|\?)/,
                    loader: 'url-loader'
                },
                // URL image loader
                {
                    test: /\.(png|jpg|jpeg)$/,
                    loader: 'file-loader?name=img/[hash:8].[name].[ext]'
                },
                // svg
                {
                    test: /\.svg$/,
                    loader: 'raw-loader'
                }
            ]
        },
    
        devServer: {
            historyApiFallback: true,
            hot: true,
            inline: true,
            progress: true,
        },
    
        plugins: [
            new webpack.optimize.CommonsChunkPlugin('common.js'),
            // new Visualizer(),
            new HtmlWepackPlugin({
                filename: `index.html`,
                inject: true,
                minify: {    //压缩HTML文件
                    removeComments: true,    //移除HTML中的注释
                    collapseWhitespace: true   //删除空白符与换行符
                }
            }),
        ],
        externals: {}
    };
    
    

    生产版本配置

    /**
     * 该文件名- webpackProConf.js
     * 编码作者- 许道龙
     * 创建日期- 2017/1/3 09:24
     * 作者邮箱- xudaolong@vip.qq.com
     * 作者博客- http://xudaolong.github.io/
     * 修改时间-
     * 修改备注-
     * 编码内容-
     */
    
    "use strict";
    
    var WebpackStripLoader = require('strip-loader');
    var devConf = require('./webpackDevConf');
    var webpack = require("webpack");
    
    // 去除console.log代码
    var stripLoader = {
        test: [/\.js$/, /\.es6$/],
        exclude: /node_modules/,
        loader: WebpackStripLoader.loader('console.log')
    };
    devConf.module.loaders.push(stripLoader);
    
    // 代码压缩
    var uglifyJs = new webpack.optimize.UglifyJsPlugin({
        compress: {
            warnings: false
        }
    });
    devConf.plugins.push(uglifyJs);
    
    // 为react指示编译生产环境代码
    var definePlugin = new webpack.DefinePlugin({
        'process.env':{
            'NODE_ENV': JSON.stringify('production')
        }
    });
    devConf.plugins.push(definePlugin);
    
    module.exports = devConf;
    
    

    相关文章

      网友评论

          本文标题:为何使用 webpack

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