webpack-打包html/css 依赖loader/plugins

html 打包依赖

  • loader中use得加载顺序是逆序得,所以我们需要注意loader得使用顺序
    • 使用插件 html-webpack-plug
    • 作用:创建html文档到输出路径,并将打包后所有资源加载其中
    • 接收一个参数tamplate 复制template中指定得html文件内容至输出路径
    • 用法:
  //  导入依赖 在插件中调用即可
    const htmlWebpackPlugin = require('html-webpack-plugin')
    plugins: [
        //  接收一个参数设置要复制得文件
        new htmlWebpackPlugin({
            template: './src/index.html'
        }),
    ],

css/sass 打包依赖

  • loader: mini-css-extract-plugin style-loader css-loader sass-loader node-sass
    • css-loader:
      • 作用:将引入入口文件得css资源加载到输出js中 css得样式会放在打包后得js中
    • style-loader:
      • 作用:将输出文件中得css部分以style得形式加载至html中
    • sass-loader:
      • 作用:编译sass文件为css文件/使用顺序在css-loader之后
      • 依赖:node-sass 和sass-loader配套使用
    • mini-css-extract-plugin:
      • 作用:整合css文件打包后生成一个css文件,并加载至html页面中
      • 需要注意的是:和style-loader冲突二选一
      • 用法:放置loader最前方,最后一个执行。
      • 在loader中调用其自身loader方法
      • 并在插件中同时调用
                const miniCssExtractPlugin = require('mini-css-extract-plugin')
                test: /\.css$/,
                use: [{
                        loader: miniCssExtractPlugin.loader,
                        options: {
                            esModule: false
                        },
                    }, 'css-loader',
        //  插件
            plugins: [
       //  接收一个参数设置输出路径 mini-css-extract-plugin 可以把css文件剥离入口文件,并在输出文件html页面中以link形式引入资源
              new miniCssExtractPlugin({
                        filename: 'css/bulit.css'
              }),
            ],
  • 处理图片资源

    • url-loader 依赖file-loader 配套使用
      • 作用:打包css文件中background:url('') 引入得路径,并可以压缩图片
      • 用法:
      • 处理图片资源 --url-loader 依赖file-loader
       {
                test: /\.(png|jpg|gif|jpeg|bmp|ttf|svg)$/,
                //  单个loader处理时可以直接书写loader + 依赖字符串形式 不用在use数组中使用
                //  使用 url-loader 依赖于 file-loader
                loader: 'url-loader',
                //  配置项
                options: {
                    //  当图片大小小于8kb,就回被base64处理
                    //  有点:减少请求数量(减少服务器压力)
                    //  缺点:图片体积会增大
                    limit: 8 * 1024,
                    //  使url-loader和html-loader得引入方式匹配  默认url-loader使用ES6 而html-loader使用CommonJs
                    esModule: false,
                    //  [ext] 取文件原来扩展名
                    //  打包图片时重命名名称  取hash后得前三位
                    name: '[hash:3].[ext]',
                }
    
    
  • 处理在html中引入得图片路径

    • html-withimg-loader
      • 作用:打包在html中引用得图片路径 <img src="1.jpg"/>
  • 打包其他静态资源

    • file-loader
      • 作用:打包静态资源 如:字体 ttf/svg/woff/eot
  • 清空打包目录,每次打包重新生成

    • clean-webpack-plugin
    • 在打包之前先清除之前得文件,在进行打包。
    • css文件压缩

      • 插件:optimize-css-asserts-webpack-plugin
        • 作用:压缩css文件为生产状态 和sass中得compress 一致
        • 用法:插件plugins中引入
  • css兼容性设置 autoprefixs

    • postcss-loader 插件:postcess-preset-env
      • 作用:根据browerslist中配置得浏览器配置,自动添加css兼容前缀 autoprefixs
      • browerslist 配置在package.json 作用匹配需要做兼容得浏览器范围
      • browerslist 设置两个模式 development/production
      • 注意:browerslist得模式和webpack得模式不同,默认为production模式,如需更改
        需要在全局中修改 process.env.NODE_ENV = "development"
      • 在loader中设置,process-loader 并在loader插件中引用postcss-preset-env
                test: /\.css$/,
                use: [{
                        loader: miniCssExtractPlugin.loader,
                        options: {
                            esModule: false
                        },
                    }, 'css-loader',
                    //  兼容配置
                    //  postcss 在webpack中是已下两种依赖
                    //  依赖:postcss-loader postcss-preset-env
                    //  postcss-preset-env 帮助postcss找到package.json中browserslist里面得配置,通过配置加载指定得css兼容样式
                    //  browserslist 在package.json中配置 目的是设置css所需要兼容得哪类浏览器
                    //  功能:设置针对浏览器得兼容配置 模式:开发,生产
                    {
                        loader: 'postcss-loader',
                        options: {
                            //  ident:识别
                            ident: 'postcss',
                            plugins: (loader) => [
                                require('postcss-preset-env')()
                            ]
                        }
                    },
                ]
  //  package.json  具体匹配规自行百度
   "browserslist": {
        "devlopment": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ],
        "production": [
            ">0.2%",
            "not dead",
            "not op_mini all"
        ]
    }
  • eslint校验

    • eslint 校验js代码
    • loader: eslint-loader eslint 配套使用
    • 作用:培养代码规范,整洁。公司代码校验
    • eslint 风格使用airbnb
    • eslint-config-airbnb-base eslint-plugin-import ;eslint-config-aribnb 支持recat
    • 使用
    {
    test: /\.js$/,
    loader:'eslint-loader',
    options:{
    //  自动修复违规代码
      fix:true
    }
    }
    // 关联airbnb
    // package.json
    eslintConfig:{
    // 继承airbnb
    "estend":"airbnb-base" 
     }
    
  • js兼容

    • babel-loader @babel/core @babel/preset-env @babel/polyfill core-js配套使用
    • 使用时,在入口文件中引入
    • import '@babel/polyfill'
    • 作用:解决ie等浏览器不识别es6等js语言
    • @babel/polyfill 优点:做完整得兼容处理 ,缺点:打包后js文件体积大
    • core-js 按需兼容 :优点:体积小,可以按照需求做兼容
    • 使用:
    {
      test:/\.js$/,
      exclude:/node_modules/,
      loader:babel-loader,
      options:{
          //预设:
          presets:[
            [
              '@babel/preset-env',
              {
                useBuiltIns: 'usage', //按需加载
                corejs: { //关联corejs
                  version:3 //在安装时会提示版本
                },
                // 指定兼容哪些浏览器版本
                targets: {
                  chrome:'60',
                  ie:'9',
                  firefox: '60',
                  safari: '10',
                  edge: '11',
                }
              }
            ]
          ]
      }
    }
    
  • HMR 模块热更新

    • 某一个模块(文件)改变时,其他某块不会重新打包
    • 在devServer中增加hot:true字段,开启热更新得模块热更新
    • html文件处理
      • html 当开启热更新后,html文件默认不支持模块热更新,同时还会造成html文件热更新失败。
        • 解决得办法:在入口entry中引入html文件entry: ['./src/js/index.js', './src/index.html'],
    • css文件处理
      • css文件通过style-loader可以完成模块热更新(适用于开发环境),当我们需要在生产环境中将所有css文
        件整合时我们在使用mini-css-extract-plugin loader将我们得css合并成一个文件
    • js文件处理
    • js文件默认不支持模块热更新
      • 解决办法
        • 当开启热更新后我们在js入口文件中监听模块热更新,当某一个模块代码发生变化时做单独处理
        •  // 在js入口文件中写入代码     入口文件自身不能设置模块热更新,因为入口文件会加载所有模块,
          if (module.hot) {
           module.hot.accept('./module1.js',() => {
               // 参数1 要监听得模块路径  参数2 回调函数
              // 我们在这里完成模块对得操作
             //  当被检测当前文件代码有错误时,不会触发当前文件得模块热更新
           })
           module.hot.accept('./module2.js',() => {
             // 我们在这里完成模块对得操作
           })
          
          }
          
  • webpack.optimize.CommonsChunkPlugin

    • 抽离js依赖
      // 在项目入口区分文件
      entry:  {
        app: resolve(__dirname,'./src/index.js' ), // 项目入口文件
        vendors: ['jquery'], // 要从入口文件中剥离出去得依赖
      } 
    plugins:[
      new webpack.optimize.CommonsChunkPlugin({
        name:'vendors', // 要剥离得依赖数组引用名称
        filename: vendors, // 剥离后得文件名称
      })
    ]
    
  • source-map

    • 调试 排错
      • 在webpack.config.js中加入 devtool: "source-map"
     //  source map  源代码后构建后代码得映射关系表,打包后得项目报错时,可以追踪到源代码
    /*
     *   devtool模式
     *   const tip = '错误代码精准信息,源代码错误位置'
     *   source-map 外部 + tip
     *   inline-source-map 内联 在打包后得文件中生成映射信息,+ tip
     *   hidden-source-map 外部 只能提示到打包后代码得错误位置 
     *   eval-source-map 内联 在打包后得文件中对引入得每一个文件得eval中生成source-map, tip
     *   nosource-source-map 外部, tip
     *   cheap-source-map 外部, tip . 只能精准到行
     *   cheap-module-source-map 外部, tip
     *   内联 和 外部得区别:1. 外部生成了文件, 内联没有 2. 内联构建速度更快
     *   开发环境:速度快,调试优
     *      速度对比(eval>inline>cheap>....)
     *      eval-cheap-source-map  包含代码提示,打包速度块
     *      eval-source-map
     *   生产环境:源代码是否隐藏?调试要不要友好
     *      内联模式代码体积大,生产环境不用内联
     *      nosource-source-map 全部隐藏
     *      hidden-source-map 只隐藏源代码, 会提示构建后的错误
     */
    
  • oneOf

    • 问题:每个不同文件在loader转换时,都会被命中。遍历module中rules中得所有loader
    • loader内容直加载一次
    • 缺点:多次处理同类型文件得loader不会全部触发,只会触发一个
    • 优点:在oneOf中得loader只加载一次
  • 缓存

    • 缓存适用于生产环境
    • 1.babel 缓存 在options中设置cacheDirectory:true 开启缓存
    • 2.文件资源缓存
      • 借助Node服务器
      • 在打包输出得时候给打包文件加上唯一标识
        • output:{filename:'index.[contenthash:10].js'}
        • 1.hash: 利用webpack每次打包生成得hash记录 缺点:修改js或css代码时,会同时触发css/js更新
        • 2.chunkhash:根据构建打包得chunk创建hash 缺点:同上
        • 3.contenthash:根据文件内容生成hash值,不同文件得hash值不一样 。
          当文件没有发生改变时hash值不变。解决了问题
  • tree shaking (树摇)

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