为何使用 webpack

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;

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,945评论 25 707
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 11,089评论 0 21
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 贵族精神 贵族安身立命的三个根本:军事上的责任,维护地区治安的义务和社会活动的体面。 贵族们的气质和自信其实来源于...
    Matrix101阅读 210评论 0 0
  • Crash in Cocoa Cocoa中会导致Crash的地方: Exceptions类型 1. 集合类越界或插...
    邹邹_ZZ阅读 376评论 0 2