1、介绍

1.1 诞生

  • 作者:Tobias Koppers(github:@sokra)

1.2 为什么前端需要构建

  • 开发分工变化 【开发的复杂化和模块化】

  • 框架变化 【框架的去中心化】

  • 语言变化 【语言的编译化】

  • 环境变化

  • 社区变化

  • 工具变化

1.3 为什么会选择webpack

  • 代码分割

  • 天生的模块化

2、概念储备

2.1 模块化

2.1.1 Js模块化

  • 命名空间(库名.类别名.方法名)
  1. var NameSpace = {};
  2. NameSpace.type = NameSpace.type || {};
  3. NameSpace.type.method = function () {}
  • CommonJS

    • 一个文件为一个模块

    • 通过module.exports暴露模块接口

    • 通过require引入模块

    • 同步执行

  • AMD/CMD/UMD

  • AMD

    • 异步的模块定义,使用define定义模块,使用require加载模块

    • requireJs - 依赖前置,提前执行

  • CMD

    • 通用的模块定义,使用define定义模块,使用require加载模块

    • seaJs - 尽可能的懒执行

  • UMD

    • 通用解决方案,判断是否支持AMD、commonJs,如果都不支持直接定义为全局变量
  • ES6

    • 一个文件一个模块

    • 通过import引入模块

    • 通过export暴露模块接口

2.1.2 Css模块化 || 设计模式

  • OOCSS

    • 面向对象的css,设计和结构的分离,内容和容器的分离
  • SMACSS

    • 可扩展和模块化结构,简化代码量和代码的维护 [btn dialog]
  • Atomic CSS

    • 原子化的css

    • <div class="w100 h100"></div>

  • MCSS

    • 多层级的css
  • AMCSS

    • 属性css设计

    • <div am-size="large"></div>

  • BEM

    • Block

      • header,menu,container,checkbox,input
    • Element

      • 块中的部分
    • Modifier

      • 一种状态

      • <div class="button button-state-warning"></div>

2.2 环境准备

2.2.1 工具安装

  • node + npm

  • vsCode / WebStorm / Sublime

2.2.2 webpack的安装

  • cnpm i webpack -g

2.3 引入模块的3种形式

  • ES6

    • 引入 import sum from './sum'

    • 暴露 export default

  • CommonJS

    • 引入 var minus = require('./minus.js')

    • 暴露 module.exports

  • AMD

    1. require(['./muti'],function(muti){
    2. console.log(muti(2,3));
    3. });
    1. define(function (require, factory) {
    2. return function () {
    3. }
    4. });

2.4 wenpack介绍

2.3.1 简介

2.3.2 核心概念

  • entry 【代码/打包的入口、单个或多个】

  • output 【打包生成的文件输出、一个或多个、自定义规则、配合CDN】

  • loaders 【处理资源文件、转换为模块】

    • 编译相关 babel-loader/ts-loader

    • 样式相关 style-loader/css-loader/less-loader/postcss-loader

    • 文件相关 url-loader/file-loader

  • plugins 【插件】

    • 参与整个打包的过程

    • 打包优化和压缩

    • 配置编译时的变量

    • 优化相关

      • CommonsChunkPlugin 【提取相同的代码块】

      • UglifyjsWebpackPlugin 【混淆和压缩代码的】

    • 功能相关

      • ExtractTextWebpackPlugin 【提取css成单独的文件】

      • HtmlWebpackPlugin 【帮助生成HTML模板的】

      • HotModuleReplacementPlugin 【模块热更新】

      • CopyWebpackPlugin 【帮助拷贝文件】

3、webpack进阶

3.1 使用webpack

  • webpack命令

    • webpack -h 【查看参数和选项】

    • webpack -v 【查看其版本】

    • webpack 【打包】

    • webpack-cli 【工具】

      • cnpm i webpack-cli -g 【可以交互式的初始化一个项目,可以直接进行迁移】
  • 第三方脚手架

    • vue-cli

    • angular-cli

    • create-react-app

3.2 打包JS

  1. module.exports = {
  2. entry:{
  3. app:'./app.js'
  4. },
  5. output:{
  6. filename:'[name].[hash:5].js'
  7. }
  8. };

3.3 编译es6

  • Babel

    • babel-loader

    • cnpm i babel-loader babel-core --save-dev

  • Babel-presets

    • 指定规范的版本,针对语法

    • cnpm i babel-preset-env --save-dev

    • target.browsers:"last 2 versions" ">1%" 【指定浏览器环境】