模块化打包工具webpack

1.模块回顾

模块化为了解决什么?

主要是为了解决变量污染的问题,以及便于维护,以及重用

什么是模块?模块化?

模块:拥有独立功能的部分
模块化:将系统分离成多个独立功能部分的 方法

模块化规范

CommonJS规范 (同步模块规范)

  1. 每个文件就是一个独立的模块,其内部所有变量私有化,对外不可见
  2. 使用module.exports进行内部资源暴露
    var name = '张三'
    module.exports.name = name
  3. 使用require进行模块加载
    require('./模块路径')
    每次require就是require一个模块的exports对象
  • require('axios') 不写./ 加载的就是node_modules的核心模块(先找项目内的,在找全局的)
  • require('./xxx') 如果./ 打头,则表示加载相对路径
同步模块化规范,适用于服务器端,不适用于浏览器端(因为浏览器都是异步加载)
  • 实现者:nodeJS

AMD (异步模块规范)

  1. 使用define定义模块(function内的就是一个独立的模块)
        define(function(){
            //模块内容
            var name = '张三'
        })
  1. 使用return,来进行暴露
        define(function(){
            //模块内容
            var name = '张三'
            var age = 20
            return {
                name,
                age
            } //使用return来暴露
        })
  1. 使用require来引入模块
  • 实现者:requireJS
CMD (异步通用模块规范)
  1. 使用define函数来定义模块
  2. 使用module.exports进行模块暴露
  3. 使用require来引入模块
  • 实现者:seaJS

经典面试题

请简述AMD CMD COMMONJS的区别?

  • COMMONJS是同步,适用于服务器端
  • AMD CMD是异步,适用于浏览器端
  • AMD依赖前置,CMD依赖就近

ES6模块化规范

  1. 一个文件就是一个独立的模块
  2. 暴露
    export xxx
  3. 引入
    import xxx from '路径'

//ES6写法

两种暴露方式

  • 方式一:直接在变量或者函数前面增加export
  • 方式二:使用export default 统一暴露

方式一

    export var name = '张三'
    export function sayHi(){
        console.log(name)
    }
    //加载,加载方式一需要使用解构(只能使用结构进行加载)
    //b.js 加载a
    import { name, sayHi } from './a.js'

方式二

var name = '张三'

function sayHi(){
    console.log(name)
}

export default {
    name,
    sayHi
}
//加载,加载是直接加载default后面的对象,所以无需结构
import aaa from './a.js'
aaa.name
aaa.sayHi()

2.Webpack 介绍

3.Webpack 安装

1. 全局安装webpack命令行工具

yarn global add webpack@3.8.1

2. 在项目内局部安装webpack依赖

yarn add webpack@3.8.1

3. 书写webpack.config.js配置文件

var path = require('path')

module.exports = {
    //入口JS文件
    entry: './src/a',
    //出口
    output: {
        //输出绝对路径
        path: path.resolve(__dirname,"dist/"),
        //输出文件名
        filename: 'bundle.js'
    }
}

//打包文件
//直接使用webpack命令进行打包!

4. 如果要开启观察者

module.exports = {
    ...
    //观察者(检测文件变化,进行自动打包)
    watch: true
}

4.Webpack入门

webpack

5.Webpack配置文件

var path= require('path');
var webpack = require('webpack');   //要使用插件,请记住一定引入webpack模块
/* webpack配置对象 */
module.exports = {
    //入口文件
    // entry: "./src/a",    //单入口,一个字符串地址 (单入单出)
    // entry: ["./src/a.js", "./src/c.js"],    //多入口,一个数组 (多入单出)
    entry: {
        // key输出的文件名: value要打包的入口文件
        aa: "./src/a.js",
        cc: "./src/c.js"
    },  //多入多出
    
    //配置输出
    output:{
        //输出的路径(硬盘路径) 使用webpack就是读取此path
        path:path.resolve(__dirname,"dist/"), // 目录,V2.0+
        //输出的文件名
        filename:"[name].js",   //[name]是webpack自己的变量!!可以解析多入口的key

        //配置服务器输出的虚拟路径(输出到内存里的路径) 使用webpack-dev-server就是读取此path
        publicPath: "/dist/",

        //异步模块自定义名称属性
        chunkFilename: "[name].js"
    },

    //loaders配置
    module: {
        //加载器规则配置
        rules: [
            //加载器对象
            //css加载器
            {
                test: /\.css$/, //匹配规则,正则表达式
                use: ['style-loader', 'css-loader']   //使用哪种加载器加载
                //use数组内执行顺序是从右到左
            },
            //less加载器
            {
                test: /\.less$/,
                use: [{
                    loader: "css-loader" // translates CSS into CommonJS
                }, {
                    loader: "less-loader" // compiles Less to CSS
                }]
            },

            //图片加载器
            {
                test: /\.(png|jpg|gif)$/,
                use: [
                  {
                    loader: 'url-loader',
                    options: {
                      limit: 8192   //大小限制8k,如果大于此限制,会自动转化为file-loader
                    }
                  }
                ]
              }
        ]
    },


    //所有插件配置的地方
    plugins: [
        // new webpack.BannerPlugin("作者:0927"), //添加注释
        // //压缩插件
        // new webpack.optimize.UglifyJsPlugin({
        //  //去掉所有注释
        //  comments:false,
        //  //抑制警告
        //  compress:{
        //      warnings:false
        //  }
        // }),
        // 提取公共模块到单独的文件(参数就是公共模块的文件名)
        // new webpack.optimize.CommonsChunkPlugin('common')
    ]


    //观察者(检测文件变化,进行自动打包)
    // watch: true
}


webpack可以对文件进行模块化打包,可以单入单出,多入单出,还可以多入多出

单入单出:

entry: './src/a'    //一个字符串的单入口

output: {
    path: xxx
    publicPath: xxx
    filename: 'bundle.js'   //单出口
}

多入单出:

entry: ['./src/a', './src/c']    //数组控制多个入口

output: {
    path: xxx
    publicPath: xxx
    filename: 'bundle.js'   //单出口
}

多入多出(注意需要修改出口):

entry: {
    key(输出模块的名字): value(入口文件路径)
    abundle: './src/a',
    cbundle: './src/c',
    .....
}

output: {
    path: xxx
    publicPath: xxx
    filename: '[name].js'   //[name]是webpack的变量,会自动获取多入口的key作为文件名
}

6.Loader模块加载器

使用步骤

1. 确定我要加载的模块类型,到官网寻找对应的loader

(比如,要加载CSS或者加载图片)
https://www.webpackjs.com/loaders/

2. 下载安装对应loader
yarn add css-loader style-loader -D
3. 配置loader的规则

所有的loader都配置在webpack.config.js里

    module.exports = {
        ...

        module: {
            rules: [
                {
                    //具体的加载规则,
                    test: 匹配的规则,正则表达式
                    use: 使用哪种类型的加载器,顺序从右到左
                },

                {
                    test: /\.less$/
                    use: ['style-loader','css-loader','less-loader']

                },
            ]
        }

    }

图片加载的加载器有两个

  1. url-loader:会直接把图片打包进JS模块内,适用于小图片(limit配置大小)
  2. file-loader:会把图片单独打包到输出文件夹内

当配置了url-loader,图片大于8kb时,会自动使用file-loader,但是不需要再配置,只需要下载即可

7.Webpack-dev-server(服务器)

1.全局安装

yarn global add webpack-dev-server@2.9.4

2.本地安装

yarn add webpack-dev-server@2.9.4 

8.Webpack插件

9.Webpack异步模块

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

推荐阅读更多精彩内容