webpack初始(1)

1. 簡(jiǎn)介

webpack(模塊打包工具):webpack是一個(gè)打包模塊化的Javascript的工具,它會(huì) 從入口模塊出發(fā),識(shí)別出源碼中的模塊化導(dǎo)入語(yǔ)句,遞歸的找出入口文件的所有依賴,將入口和其他所有的依賴打包到一個(gè)單獨(dú)的文件.

2. 安裝

2.1 全局安裝

會(huì)造成多個(gè)項(xiàng)目只能使用同一個(gè)webpack版本

//在webpack 4.0版本需要安裝兩個(gè)
npm install webpack webpack-cli -g
//檢查版本
webpack -v
// 卸載
npm uninstall webpack webpack-cli -g

2.2 局部安裝

支持多個(gè)項(xiàng)目使用不同webpack版本

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

如何使用 
方法一: ./node_modules/.bin/webpack
node_modules/.bin 下 的文件都是可執(zhí)行文件,都是原文件的軟連接(符號(hào)鏈接)
.bin 下面的文件都是npm 生成的
#!/usr/bin/env node
#!:一般放在第一行,告訴使用者使用什么程序執(zhí)行下面代碼(軟鏈接和符號(hào)鏈接叫法都和這個(gè)有關(guān)系)
/usr/bin/env :node 的位置
node:使用node執(zhí)行
方法二:npx webpack
npx 會(huì)自動(dòng)查找當(dāng)前依賴包中的可執(zhí)行文件,如果找不到,就會(huì)去 PATH 里找。如果依然找不到,就會(huì)幫你安裝。
方法三: 配置package.json中的script
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webapck"
  },
執(zhí)行 npm run dev
npm run 會(huì)創(chuàng)建一個(gè)shell腳本,這個(gè)腳本把當(dāng)前項(xiàng)目的node_modules/.bin的絕對(duì)路徑放在了系統(tǒng)的環(huán)境變量中


env:查看環(huán)境變量
rm -rf 與 rimraf 一樣都是刪除文件
scripts 中 有兩種腳本鉤子pre(前置鉤子),post(后置鉤子),在dev前加上pre成predev,當(dāng)執(zhí)行dev的時(shí)候,回先執(zhí)行predev,postdev為執(zhí)行完dev后執(zhí)行的命令

package.json 中的bin 作用
當(dāng)文件被引入進(jìn)去的時(shí)候,npm將軟鏈接這個(gè)文件到prefix/bin里面,以便于全局引入,或在./node_modules/.bin/目錄里; bin中的key值是引入時(shí)候的名稱

3. 配置

webpack 4.x 默認(rèn)只支持 js和json格式

默認(rèn)配置 webpack.config.js

const path=require('path');
module.exports={
    //構(gòu)建入口
    entry:'./src/index.js',
    output:{
        // path 為絕對(duì)路徑 ,輸出的目錄
        path:path.resolve(__dirname,'./dist'),
        filename:"[name].js",//輸出的名稱
    },
    mode:"development"
}

3.1 入口 entry

指定webpack打包入口文件:Webpack 執(zhí)行構(gòu)建的第一步將從 Entry 開(kāi)始,可抽象成輸入

適合一個(gè)單頁(yè)面(spa),輸入為字符串或者數(shù)組
entry: string|Array<string> 
entry: './path/to/my/entry/file.js' | ['./path/to/my/entry/file.js']


適合一個(gè)多頁(yè)面應(yīng)用(mpa),輸入為對(duì)象
entry: {[entryChunkName: string]: string|Array<string>}
上面的entry相當(dāng)于
entry:{
  main: './path/to/my/entry/file.js' ,
}
對(duì)象的key值為output輸出適合的 name(默認(rèn)為main),

3.2 出口 output

打包轉(zhuǎn)換后的文件輸出到磁盤位置

    output:{
        // path 為絕對(duì)路徑 ,輸出的目錄
        path:path.resolve(__dirname,'./dist'),
        filename:"[name]-[hash:6].js",
      //輸出的名稱 name為多頁(yè)面的key或者默認(rèn)的main,
      //hash為此次構(gòu)建的hash值,用于與緩存,后面的:6可以設(shè)置也可以不設(shè)置,設(shè)置數(shù)值為截取個(gè)數(shù)(長(zhǎng)度)
    },

3.3 mode

Mode用來(lái)指定當(dāng)前的構(gòu)建環(huán)境(‘none' | 'production' | 'development')

選項(xiàng) 描述 優(yōu)點(diǎn)
development 會(huì)將 process.env.NODE_ENV 的值設(shè)為 development。啟用 NamedChunksPlugin 和 NamedModulesPlugin。 開(kāi)啟有利于熱更新處理,識(shí)別模塊變化
production 會(huì)將 process.env.NODE_ENV 的值設(shè)為 production。啟用 FlagDependencyUsagePlugin, FlagIncludedChunksPlugin, ModuleConcatenationPlugin, NoEmitOnErrorsPlugin, OccurrenceOrderPlugin, SideEffectsFlagPlugin 和 UglifyJsPlugin 開(kāi)啟壓縮,處理副作用
none 退出任何默認(rèn)優(yōu)化選項(xiàng) 更靈活

3.4 module

loader,模塊解析,模塊轉(zhuǎn)換器?,用于把模塊原內(nèi)容按需轉(zhuǎn)換成新內(nèi)容,webpack默認(rèn)只知道如何處理js和JSON模塊,?那么其他模塊如何處理呢,這就用到了不同的loader,但是一個(gè)loader只處理一件事

loader在一個(gè)test中 執(zhí)行有順序,從右像左,從下到上

module:{
        rules:[
            {
                test:/.css$/,//處理css
                use:[
                    {
                        loader:'style-loader' //把css加入到html中
                        options:{
                            injectType: "singletonStyleTag"  //將所有的style標(biāo)簽合并成一個(gè)
                        }
                    },
                    },
                    'css-loader' //處理css
                ],
                // use:['style-loader','css-loader']
            },
            {
                test:/.(png|jpe?g|gif)$/,//處理圖片
                use:{
                    // loader:'file-loader', //file-loader 只是移動(dòng)文件,還有一個(gè)
                    loader:'url-loader',//url-loader 內(nèi)部使用file-loader。可以處理所有的file-loader干的事,但是遇到j(luò)pg格式的模塊,會(huì)把該圖片轉(zhuǎn)化成base64格式的字符串。
                    // 打包到j(luò)s里,適合小體積的圖片,大圖片不合適
                    // 額外配置,比如名稱。hash等
                    options:{
                        name:'[name]_[hash:6].[ext]',//輸出name  //name為本身文件的name,ext代表后綴
                        outputPath:'images/' //輸出到的目錄
                    }
                },
            },
            {
                test:/.(woff2?|ttf|svg|eot)$/,//處理字體
                use:{
                    loader:'file-loader', //file-loader 只是移動(dòng)文件,還有一個(gè)
                    options:{
                        name:'[name]_[hash:6].[ext]',//輸出name  //name為本身文件的name,ext代表后綴
                        outputPath:'font/' //輸出到的目錄
                    }
                },
            }
        ]
    }

css自動(dòng)添加前綴

// npm i postcss-loader autoprefixer -D
         {
                test: /.css$/,//處理css
                use: [
                    {
                        loader: 'style-loader', //把css加入到html中
                        options: {
                            injectType: "singletonStyleTag" //將所有的style標(biāo)簽合并成一個(gè)
                        }
                    },
                    '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']
            },
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、概念 本質(zhì)上,webpack 是一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊打包器(module bun...
    Timmy小石匠閱讀 2,508評(píng)論 0 29
  • 原文首發(fā)于:Webpack 3,從入門到放棄 Update (2017.8.27) : 關(guān)于 output.pub...
    昵稱都被用完了衰閱讀 2,003評(píng)論 4 19
  • 熟悉 webpack 與 webpack4 配置。 webpack4 相對(duì)于 3 的最主要的區(qū)別是所謂的零配置,但...
    yichen_china閱讀 1,489評(píng)論 0 3
  • 上一章 剛從頭頂掠過(guò)的那些個(gè)身影,正是跟在上官熙一行人身后,尋找進(jìn)入鬼界大門的世家大族。最前方的是大將軍之子方曜,...
    琉璃唐草閱讀 286評(píng)論 0 0
  • 如果我們?cè)琰c(diǎn)開(kāi)始,會(huì)不會(huì)早點(diǎn)結(jié)束 如果我們?cè)琰c(diǎn)認(rèn)識(shí),會(huì)不會(huì)有不一樣的結(jié)果 如果我早點(diǎn)愛(ài)上你,會(huì)不會(huì)有不一樣的經(jīng)歷 ...
    墨雨戀琴閱讀 160評(píng)論 4 1

友情鏈接更多精彩內(nèi)容