webpack

webpack

网络打包工具

在项目中安装就去掉global

yarn global add webpack

yarn global add webpack-cli

webpack --version

打包npm run build

在webpack中,只会打包压缩js文件,如果有css等其他文件,那么必须要依赖包,安装完成后需要在webpack.config,js进行配置

用插件的话实例化就行了。例如清理器等

需要创建src文件夹和index.js

默认的入口文件是src/index.js

打包命令

webpack -w --mode production    //压缩
webpack -w --mode development  //不压缩

如果是在项目中安装的话

**package.json
//在此文件下进行自定义更改命令,在项目目录打开命令行,执行yarn run build 就会执行此行代码,即打包项目
  "scripts":{
    "build":"webpack"
  }

通过打包压缩 ,出口在dist/main.js

打包的好处之一:压缩体积减少http的请求次数,优化性能之一

在项目组配置webpack文件

创建和src同级文件:

**webpack.config.js
const path = require('path')
module.exports={
    // 入口文件
    entry:'./src/index.js',
    // 出口文件
    output:{
        //__dirname,根据当前目录和dist生成绝对路径
        path:path.resolve(__dirname,'dist'),
        // 打包后的文件名字 
        filename:'main[hash:8].js'
    },
} 

下载css

//引入时注意
yarn add style-loader
yarn add css-loader

配置loader

module:{
    rules:[
        {
            // 正则,以.xxx结尾的文件
            "test":/\.css$/, 
            // 使用xxxloader
            use:["style-loader","css-loader"]
        }
    ]
}

下载清理器mian.js

const { CleanWebpackPlugin } = require('clean-webpack-plugin');
plugins:[
    new CleanWebpackPlugin(),
]

清理完成后dist里的mian.js每更改一次,名字就会变化,那么每次都需要重新引入,所以需要下载自动引入

yarn add html-webpack-plugin

下载,热更新和自动打开浏览器

yarn add webpack-dev-server -w -open

打包图片

//
yarn add file-loader url-loader

es6转es5

yarn add babel-loader @babel/preset-env @babel/core

全局安装webpack

  • webpack是个打包工具,脚手架是基于webpack这个打包工具的
  • webpackjs.com官网
  • webpack --version查看版本 ---4.38 ----现在有webpack5了
  • dist为打包之后的文件
  • 在webpack眼中,静态资源都是模块
  • yarn global add webpack yarn global add webpack-cli 全局安装
  • yarn add webpack yarn add webpack-cli 局部安装 【全局和局部都安了,优先执行全局,想换见'在项目中用webpack'】
  • webpack从4以上的版本,默认的入口文件是src 下的index.js文件
  • 打包操作webpack --mode developmentwebpack --mode production
    • 注意:mode是选择打包模式,development是开发模式,不压缩,production是生产模式(上线),是压缩的
  • 默认出口文件是 dist下的main.js文件
  • webpack -w --mode production加了-w 的可同步文件,不用每次改了文件内容后都重新打包,改了后刷新即可同步文件内容
    • webpack --hot --mode production也有此作用

在项目中用webpack--局部安装

全局和局部同时都安了,在项目中想执行局部的,可以在项目的package.json中script中输

【#linux操作系统,是以命令行的为主的操作系统】

#package.json
'script':{
  'test ':"echo hello world "  //运行项目npm test 会出现hello world 
  'abc':"echo hello world " //除了test和start可省略run,否则都是npm run运行项目 //运行npm run abc 会出现hello world
  'bulid':webpack --mode production //打包操作 //一般不写-w,因此处为打包操作,故不用热更新 //npm run build 进行打包
 }    //还有一种写法见【webpack.config.js】
}
#打包操作的好处
1.所有文件打包成了一个文件,按页面优化的规则,可以减少http的请求次数,是优化的手段之一
2.webpack打包工具可以保证每个js文件是一个独立的模块,相当于在浏览器中实现模块化,从而以模块化开发做项目,否则浏览器本身不直接支持模块化
  gulp打包在页面里只引入了一个文件,然后还需要配合require.js等其他文件做模块化,目前require.js这些已经不再升级了,webpack打包工具是主流

webpack基本配置文件---webpack.config.js

  • 默认的webpack 的配置文件名是 webpack.config.js ,可以改,但一般不改!
  • webpack.config.js在根目录上,和src是平级的
  • webpack.config.js 核心概念(4个):入口,出口,loader,插件
    • loader是加载器,用于加载某一类文件时,做解析用的,即:将除了js文件以外的文件解析成标准的模块
    • 插件是能对所有文件进行处理,如:清理所有文件、打开服务器增加某项功能等
    • 入口是src 下的index.js文件
    • 出口是 dist下的main.js文件
#webpack.config.js
const path=require('path') //不能用import 这是node环境,不支持es6的模块化
module.exports={
  entry:'./src/index.js',   //entry入口文件
  output:{                 //output出口文件,下面的对象表示指定某目录下的某文件为出口文件
    path:path.resolve(__dirname,'dist'),  //dirname是当前目录  //path.resolve生成绝对路径
    filename:'main[hash:8].js' //为了避免文件缓存,hash8用于产生8位的hash码,加在main文件名后-->文件名带了hash码每次build会生成文件名不同的文件,不便于引入文件时写名字-->自动将改了的文件在引入处进行文件名修改&将旧文件清理的 插件和操作见下面
  }
}
#index.html
//在index.html引入出口文件以应用
<script serc="dist/main.js"></script>

--->自动将旧文件清理 
1.安装插件 yarn add clean-webpack-plugin
2.webpack.config.js引入插件并使用
const { CleanWebpackPlugin } = require('clean-webpack-plugin'); 
plugins:[
        new CleanWebpackPlugin()
    ]
--->自动将改了的文件引入
1.安装插件 yarn add html-webpack-plugin
2.webpack.config.js引入插件并使用   //一定要先将index.html中<script>去掉!
const HtmlWebpackPlugin = require('html-webpack-plugin');
plugins:[
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({template: './index.html'})
    ]

#此为单入口和单出口,webpack支持多入口和多出口,见官网

【另外】
在package.json中可以不指定打包模式
#package.json
'script':{
  'bulid':webpack
 }
在webpack.config.js中指定打包模式
#webpack.config.js
mode:'production'  或  mode:'development'  //可以指定打包模式

【完整写法如下】
#webpack.config.js
const path = require("path");
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    entry:'./src/index.js',
    output:{
        path:path.resolve(__dirname,'dist'),
        filename:'main[hash:8].js'
    },
    mode:'development',
    devServer:{
       contentBase:'dist',
       inline:true
    },
    module:{
        rules:[
            {
                "test":/\.css$/,
                use:[
                      { loader: 'style-loader' },
                      { loader: 'css-loader' }
                    ] 

            }
        ]
    },
    plugins:[
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({template: './index.html'})
    ]

}

webpack-dev-server --支持热更新!不用手动刷新

yarn add webpack-dev-server

  • 会自动打开8080端口
#package.json
'script':{
   'build':"webpack"
   'serve':"webpack-dev-server -w --open"        //-w 同步文件 --open自动打开浏览器
}

#webpack.config.js
devServer:{
  contentBase:'dist'    //默认的目录
  inline:true         //开启热更新
}

使用loader文件打包---非js文件的打包

  • 如果不是js文件,需要各种loader文件用于打包

打包CSS文件

打包css文件需要style-loadercss-loader

  • yarn add style-loader css-loader【注意:此处引入是有顺序的!】
  • 需要配置以下
#webpack.config.js
const path=require('path') 
module.exports={        
  entry:'./src/index.js',   
  output:{                 
    path:path.resolve(__dirname,'dist'),  
    filename:'main[hash:8].js' 
  },
  module:{        //loader加载的是模块module,roules是模块的规则,每个规则是一个对象,什么的模块用什么去解析
      rules:[
        { test: /\.css$/,         //什么的模块
          use: [                    //用什么去解析
                  { loader: 'style-loader' },
                  { loader: 'css-loader' }
                ]       
        }   
      ]
  }
}         
}

打包图片文件

  • 打包图片文件需要style-loadercss-loader

  • yarn add file-loader url-loader

  • 需要配置以下

    #webpack.config.js 写在module的rules里面 
    rules:[
             {
              test: /\.(png|jpg|gif)$/i,
              use: [
                {
                  loader: 'url-loader',
                  options: {
                    limit: 8192,  //比8192小的就base64编码打包到js中,比8192大的就单独打包到一个文件
                  }
                },
              ],
            }    
          ]
    

es6转es5

  • 打包图片文件需要babel-loader@babel/core@babel/preset-env

  • yarn add babel-loader @babel/core @babel/preset-env

  • 需要配置以下

    #webpack.config.js 写在module的rules里面 
    rules:[
            {
              test: /\.js$/,
              exclude: /node_modules/,     //一定要排除module
              use: {
                loader: 'babel-loader',
                options: {
                    presets: ['@babel/preset-env','@babel/preset-react']
                 }
               }
    ]
    

配React环境

  • 配React环境需要reactreact-dom@babel/preset-react

yarn add react react-dom @babel/preset-react

配Vue环境

  • 配Vue环境需要vuevue-lodervue-template-complile

yarn add vue vue-loder vue-template-complile

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

推荐阅读更多精彩内容