webpack初始(1)

1. 简介

webpack(模块打包工具):webpack是一个打包模块化的Javascript的工具,它会 从入口模块出发,识别出源码中的模块化导入语句,递归的找出入口文件的所有依赖,将入口和其他所有的依赖打包到一个单独的文件.

2. 安装

2.1 全局安装

会造成多个项目只能使用同一个webpack版本

//在webpack 4.0版本需要安装两个
npm install webpack webpack-cli -g
//检查版本
webpack -v
// 卸载
npm uninstall webpack webpack-cli -g

2.2 局部安装

支持多个项目使用不同webpack版本

npm install webpack webpack-cli -D
 //局部安装 webpack 命令找不到

如何使用 
方法一: ./node_modules/.bin/webpack
node_modules/.bin 下 的文件都是可执行文件,都是原文件的软连接(符号链接)
.bin 下面的文件都是npm 生成的
#!/usr/bin/env node
#!:一般放在第一行,告诉使用者使用什么程序执行下面代码(软链接和符号链接叫法都和这个有关系)
/usr/bin/env :node 的位置
node:使用node执行
方法二:npx webpack
npx 会自动查找当前依赖包中的可执行文件,如果找不到,就会去 PATH 里找。如果依然找不到,就会帮你安装。
方法三: 配置package.json中的script
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webapck"
  },
执行 npm run dev
npm run 会创建一个shell脚本,这个脚本把当前项目的node_modules/.bin的绝对路径放在了系统的环境变量中


env:查看环境变量
rm -rf 与 rimraf 一样都是删除文件
scripts 中 有两种脚本钩子pre(前置钩子),post(后置钩子),在dev前加上pre成predev,当执行dev的时候,回先执行predev,postdev为执行完dev后执行的命令

package.json 中的bin 作用
当文件被引入进去的时候,npm将软链接这个文件到prefix/bin里面,以便于全局引入,或在./node_modules/.bin/目录里; bin中的key值是引入时候的名称

3. 配置

webpack 4.x 默认只支持 js和json格式

默认配置 webpack.config.js

const path=require('path');
module.exports={
    //构建入口
    entry:'./src/index.js',
    output:{
        // path 为绝对路径 ,输出的目录
        path:path.resolve(__dirname,'./dist'),
        filename:"[name].js",//输出的名称
    },
    mode:"development"
}

3.1 入口 entry

指定webpack打包入口文件:Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入

适合一个单页面(spa),输入为字符串或者数组
entry: string|Array<string> 
entry: './path/to/my/entry/file.js' | ['./path/to/my/entry/file.js']


适合一个多页面应用(mpa),输入为对象
entry: {[entryChunkName: string]: string|Array<string>}
上面的entry相当于
entry:{
  main: './path/to/my/entry/file.js' ,
}
对象的key值为output输出适合的 name(默认为main),

3.2 出口 output

打包转换后的文件输出到磁盘位置

    output:{
        // path 为绝对路径 ,输出的目录
        path:path.resolve(__dirname,'./dist'),
        filename:"[name]-[hash:6].js",
      //输出的名称 name为多页面的key或者默认的main,
      //hash为此次构建的hash值,用于与缓存,后面的:6可以设置也可以不设置,设置数值为截取个数(长度)
    },

3.3 mode

Mode用来指定当前的构建环境(‘none' | 'production' | 'development')

选项 描述 优点
development 会将 process.env.NODE_ENV 的值设为 development。启用 NamedChunksPlugin 和 NamedModulesPlugin。 开启有利于热更新处理,识别模块变化
production 会将 process.env.NODE_ENV 的值设为 production。启用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin 开启压缩,处理副作用
none 退出任何默认优化选项 更灵活

3.4 module

loader,模块解析,模块转换器器,用于把模块原内容按需转换成新内容,webpack默认只知道如何处理js和JSON模块,?那么其他模块如何处理呢,这就用到了不同的loader,但是一个loader只处理一件事

loader在一个test中 执行有顺序,从右像左,从下到上

module:{
        rules:[
            {
                test:/.css$/,//处理css
                use:[
                    {
                        loader:'style-loader' //把css加入到html中
                        options:{
                            injectType: "singletonStyleTag"  //将所有的style标签合并成一个
                        }
                    },
                    },
                    'css-loader' //处理css
                ],
                // use:['style-loader','css-loader']
            },
            {
                test:/.(png|jpe?g|gif)$/,//处理图片
                use:{
                    // loader:'file-loader', //file-loader 只是移动文件,还有一个
                    loader:'url-loader',//url-loader 内部使用file-loader。可以处理所有的file-loader干的事,但是遇到jpg格式的模块,会把该图片转化成base64格式的字符串。
                    // 打包到js里,适合小体积的图片,大图片不合适
                    // 额外配置,比如名称。hash等
                    options:{
                        name:'[name]_[hash:6].[ext]',//输出name  //name为本身文件的name,ext代表后缀
                        outputPath:'images/' //输出到的目录
                    }
                },
            },
            {
                test:/.(woff2?|ttf|svg|eot)$/,//处理字体
                use:{
                    loader:'file-loader', //file-loader 只是移动文件,还有一个
                    options:{
                        name:'[name]_[hash:6].[ext]',//输出name  //name为本身文件的name,ext代表后缀
                        outputPath:'font/' //输出到的目录
                    }
                },
            }
        ]
    }

css自动添加前缀

// npm i postcss-loader autoprefixer -D
         {
                test: /.css$/,//处理css
                use: [
                    {
                        loader: 'style-loader', //把css加入到html中
                        options: {
                            injectType: "singletonStyleTag" //将所有的style标签合并成一个
                        }
                    },
                    'css-loader', //处理css
                    {
                        loader: "postcss-loader",
                        options: {
                            // Necessary for external CSS imports to work
                            // https://github.com/facebookincubator/create-react-app/issues/2677
                            ident: 'postcss',
                            plugins:  [
                                autoprefixer({
                                    browsers: [
                                        '>1%',
                                        'last 4 versions',
                                        'Firefox ESR',
                                        'not ie < 9', // React doesn't support IE8 anyway
                                    ],
                                }),
                            ],
                        }
                    }
                ]
                // use:['style-loader','css-loader']
            },
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容