国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

webpack4+vue打包簡單入門

junbaor / 1499人閱讀

摘要:前言最近在研究使用的使用在查閱了數篇文章后學習了的基礎打包流程本來就可以一刪了之了但是覺得未免有點可惜所以就有了這篇文章供大家參考打包的教程具有時效性有不少作者在一直維護一篇文章超過一定時間參考價值就會下降希望各位了解這一點使用的依賴一覽

前言

最近在研究使用webpack的使用,在查閱了數篇文章后,學習了webpack的基礎打包流程.

本來就可以一刪了之了,但是覺得未免有點可惜,所以就有了這篇文章,供大家參考.

webpack打包的教程具有時效性,有不少作者在一直維護一篇文章.超過一定時間參考價值就會下降,希望各位了解這一點.

使用的依賴一覽
"devDependencies": {
"clean-webpack-plugin": "^0.1.19",
"css-loader": "^1.0.0",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.4.3",
"vue-loader": "^15.4.2",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.5.17",
"webpack": "^4.19.1",
"webpack-cli": "^3.1.0",
"webpack-merge": "^4.1.4"
},
"dependencies": {
"vue": "^2.5.17"
}

都是目前最新的穩定版本.

講解到的內容

webpack的安裝

webpack簡單配置

vue的安裝以及使用

使用插件

提取css

使用多個配置文件

簡單的代碼分離

構建目錄

我們創建一個新的目錄(learnwebpack).在下面創建src文件夾和一個index.html.

然后我們使用npm init命令初始化一個package.json文件,直接一路回車過去就好了.

目錄結構:

learnwebpack

src

index.html

package.json

src保存我們未經編譯的源碼.

index.html內容如下:




    
    
    
    Webpack4 && Vue


    
安裝webpack

在webpack4中不僅僅需要安裝webpack本身,還需要安裝webpack-cli.

npm install webpack webpack-cli --save-dev

使用--save-dev參數會將這兩個包添加到package.json的開發依賴中.

webpack4的特性

在webpack4中可以實現0配置打包,也就是說不需要任何設置就可以完成簡單的打包操作.

此外最實用的特性之一就是mode配置選項用于告訴webpack輸出模式是開發還是產品,提供了已經預先定義好的常用配置.

后面的例子中我們會使用到mode.

webpack的簡單配置

我們在當前目錄下新建一個webpack的配置文件webpack.config.js.

此時的目錄結構為:

learnwebpack

src

index.html

webpack.config.js

package.json

webpack.config.js的內容:

const {join:pathJoin} = require("path");
module.exports = {
    entry:{
        app:"./src/index.js" // 入口文件的位置
    },
    output:{
        filename:"[name].bundle.js", // 輸出文件名字的格式
        path:pathJoin(__dirname,"./dist") // 輸出的絕對路徑
    },
}
為什么會有filename上的格式

對于我們當前的應用來說好像沒有任何用途,打包后文件名完全可以和入口一樣.

使用不同的文件名可以解決相同文件名稱導致的瀏覽器緩存問題.

對于我們當前這個格式來說,打包后的文件名稱為app.bundle.js.

此外還有一些額外的模板符號:

[hash] 模塊標識符(module identifier)的 hash

[chunkhash] chunk 內容的 hash

[name] 模塊名稱

[id] 模塊標識符(module identifier)

[query] 模塊的 query,例如,文件名 ? 后面的字符串

現在讓我們在src文件夾下新建一個index.js,只寫一行簡單的代碼用于測試:

console.log("hello world!");

此時的目錄結構為:

learnwebpack

src

index.js

index.html

webpack.config.js

package.json

為什么使用index.js

webpack4中零配置的默認入口位置就是當前配置路徑下的./src/index.js,也就是說如果不指定入口的情況下也是可以打包的.

構建我們的項目

運行:

./node_modules/.bin/webpack-cli --config webpack.config.js

上方的命令有點冗長,我們使用package.json中scripts字段來定義一個快捷方式.

package.json:

{
  +++
  "scripts": {
    "build": "webpack --config webpack.config.js"
  }
  +++
}

+++ 表示package.json的其他字段,這部分目前不用關心.

現在運行這條簡化的命令,效果和上方一樣.

npm run build

對于npm版本高于5.2.0的同學可以嘗試使用npm的附帶模塊npx.

npx可以直接運行./node_modules/.bin/下的內容而不必輸入路徑.

npx webpack --config webpack.config.js

如果操作正確你的目錄下應該會多出一個dist文件夾,內部有一個app.bundle.js文件.

此時的目錄結構:

learnwebpack

dist

app.bundle.js

src

index.js

index.html

webpack.config.js

package.json

我們可以運行index.html了,如果一切順利.那么在控制臺中應該會出現hello world!.

錯誤

當我們打包的時候webpack4會報錯,原因就是我們沒有指定上文中提到的mode屬性,webpack默認將他設置為production.

此時如果你查看代碼,就會發現代碼是經過壓縮的,這是webpack4的默認行為之一.

WARNING in configuration
The "mode" option has not been set, webpack will fallback to "production" for this value. Set "mode" option to "development" or "production" to enable defaults for each environment.
You can also set it to "none" to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/
安裝Vue

使用npm安裝:

npm -i vue

vue是運行時依賴,webpack需要合適loader將vue文件解釋為webpack可以理解的格式用于構建,所以我們需要vue-loader來轉換vue單文件.

使用npm安裝vue-loader:

npm install vue-loader --save-dev 

vue單文件中分為三個部分,其中template部分需要專用的插件進行轉換.

安裝vue-template-compiler:

npm install  vue-template-compiler --save-dev

這個使用vue-loader自動調用的插件,也是官方默認的,不需要任何配置.

如果你不使用他,打包的時候會報錯.

簡單來說他的功能是將template部分的模板轉為render函數.

然后我們需要處理css,vue-loader需要css-loader才可以運行.

安裝css-loader:

npm install css-loader --save-dev

css-loader的作用僅僅是將css轉為webpack可以解釋的類型,如果我們需要將樣式使用起來插入到html中,必須使用額外的插件.

安裝vue-style-loader:

npm install vue-style-loader --save-dev

vue-style-loader是由vue官方維護的你也可以使用其他的loader來處理css,他除了提供了常見的插入樣式到html的功能以外還提供了其他的功能,例如熱更新樣式等.

修改配置

webpack.config.js:

const {join:pathJoin} = require("path");
const VueLoaderPlugin = require("vue-loader/lib/plugin"); // +++
module.exports = {
    mode:"production",
    entry:{
        app:"./src/index.js"
    },
    output:{
        filename:"[name].bundle.js",
        path:pathJoin(__dirname,"./dist")
    },
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"] // +++
            },
            {
                test: /.css$/,
                use: ["vue-style-loader","css-loader"] // +++
            }
        ]
    },
    plugins:[
        new VueLoaderPlugin() // +++
    ]
}

需要注意的是VueLoaderPluginvue-loaderv15的版本中,這個插件是必須啟用的.

修改目錄結構以及文件

我們在src下創建一個pages文件夾并且在內部創建一個app.vue文件.

此時的目錄結構:

learnwebpack

dist

app.bundle.js

src

pages

app.vue

index.js

index.html

webpack.config.js

package.json

app.vue文件內容:





app.vue是由index.js引用的,回過頭來我們修改index.js:

import Vue from "vue"
import App from "./pages/app.vue";

new Vue({
    el:"#root",
    render:h=>h(App)
})

激動人心的時候到了,如果一切順利你的vue應用應該打包完成了,運行index.html就可以查看這個結果了.

使用插件

回顧前面的一個話題,指定輸出文件名字格式.如果你將我們的內容放到一個服務器上運行,你會很容易發現一個問題.

就是緩存,web上的資源瀏覽器會對其進行緩存,但是對開發的時候,或者產品中的代碼更新十分不友好,新的代碼不會得到及時的使用.

我們讓資源每次的名字不一樣就可以簡單的解決這個問題,接下來修改我們的webpack.config.js:

const {join:pathJoin} = require("path");
const VueLoaderPlugin = require("vue-loader/lib/plugin");
module.exports = {
    +++
    output:{
        filename:"[name].[hash].js",
        path:pathJoin(__dirname,"./dist")
    },
    +++
}

此時再次修改代碼打包每次的名字都不會一樣.

但是出現了另外一個問題由于資源名字每次都不一致,每次我都需要手動指定index.html中引用的資源,這個時候該html-webpack-plugin出場了.

這個插件可以自動生成一個html文件,并且將資源文件按照正確順序插入到html中.

安裝html-webpack-plugin:

npm install html-webpack-plugin --save-dev

webpack.config.js添加配置

const {join:pathJoin} = require("path");
const VueLoaderPlugin = require("vue-loader/lib/plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
    entry:{
        app:"./src/index.js"
    },
    output:{
        filename:"[name].[hash]].js",
        path:pathJoin(__dirname,"./dist")
    },
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"]
            },
            {
                test: /.css$/,
                use: ["vue-style-loader","css-loader"]
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:"template.html",// 指定模板html文件
            filename:"index.html"http:// 輸出的html文件名稱
        }),
        new VueLoaderPlugin()
    ]
}

然后我們把index.html重命名為template.html,將template.html中的script標簽刪除.

指定模板后HtmlWebpackPlugin會保留原來html中的內容,而且會在新生成的html文件中把script插入到合適的位置.

HtmlWebpackPlugin補充

注意:HtmlWebpackPlugin必須位于插件數組的首位.

運行項目

你會發現在dist目錄下會有index.html文件,而我們打包后的index.js的輸出文件名也變成了app.XXXXXXXXXXXXXXXX.js的格式,更加神奇的是在index.html中自動插入了script標簽來引用打包后的js文件.

使用CleanWebpackPlugin插件

當你多次打包的時候,你會發現由于使用hash來命名輸出的文件每次的文件名稱都不一樣,導致文件越來越多.

使用CleanWebpackPlugin可以每次構建前清空輸出目錄.

安裝:

npm install clean-webpack-plugin --save-dev

webpack.config.js:

const {join:pathJoin} = require("path");
const VueLoaderPlugin = require("vue-loader/lib/plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CleanWebpackPlugin = require("clean-webpack-plugin");// +++
module.exports = {
    entry:{
        app:"./src/index.js"
    },
    output:{
        filename:"[name].[hash]].js",
        path:pathJoin(__dirname,"./dist")
    },
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"]
            },
            {
                test: /.css$/,
                use: ["vue-style-loader","css-loader"]
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:"template.html",
            filename:"index.html"
        }),
        new VueLoaderPlugin(),
        new CleanWebpackPlugin(["dist"])// +++ 運行前刪除dist目錄
    ]
}

現在無論運行幾次構建dist目錄下都是干凈的.

提取css

現在我們來將vue單文件中的css提取出來到一個多帶帶的css文件中.

webpack4中完成這個功能的插件是mini-css-extract-plugin.

安裝:

npm install mini-css-extract-plugin --save-dev

webpack.config.js:

const {join:pathJoin} = require("path");
const VueLoaderPlugin = require("vue-loader/lib/plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CleanWebpackPlugin = require("clean-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");// +++
module.exports = {
    entry:{
        app:"./src/index.js"
    },
    output:{
        filename:"[name].[hash]].js",
        path:pathJoin(__dirname,"./dist")
    },
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"]
            },
            {
                test: /.css$/,
                use: [
                    {
                        loader:MiniCssExtractPlugin.loader // +++
                    },
                    "css-loader"
                ]
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:"template.html",
            filename:"index.html"
        }),
        new MiniCssExtractPlugin({
            filename:"style.css" // 指定輸出的css文件名.
        }),
        new VueLoaderPlugin(),
        new CleanWebpackPlugin(["dist"])
    ]
}

運行我們的項目,現在dist目錄下已經有一個style.css的文件了,而且htmlwebpackplugin自動將style.css插入到了index.html中.

使用多個配置

考慮以下問題:

開發的時候我們希望打包速度快,有源代碼提示,有熱重載(本篇文章沒有涉獵)...

發布產品我們希望輸出的內容不會被緩存,有代碼壓縮...

是時候使用多個配置了,一個用于開發一個用于生產.

但是我們還可以做的更好使用webpack-merge插件,可以將多個配置合成.

安裝webpack-merge:

npm install webpack-merge --save-dev

首先我們定義一個包含基本信息的webpack配置文件,這個文件被其他配置文件依賴.

webpack.common.js:

const {join:pathJoin} = require("path");
const CleanWebpackPlugin = require("clean-webpack-plugin");
const VueLoaderPlugin = require("vue-loader/lib/plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
    entry:{
        app:"./src/index.js"
    },
    output:{
        filename:"[name].[hash].js",
        path:pathJoin(__dirname,"./dist")
    },
    plugins:[
        new HtmlWebpackPlugin({
            template:"template.html",
            filename:"index.html"
        }),
        new VueLoaderPlugin(),
        new CleanWebpackPlugin(["dist"])
    ]
}

可以看到這里定義的都是最基本的信息.

然后我們定義開發配置并且在內容使用webpack-merge插件和webpack.config.js進行合并.

webpack.dev.js:

const merge = require("webpack-merge");
const common = require("./webpack.common.js");

module.exports = merge(common, {
    mode: "development", // 不壓縮代碼,加快編譯速度
    devtool: "source-map", // 提供源碼映射文件調試使用
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"]
            },
            {
                test: /.css$/,
                use: ["vue-style-loader","css-loader"] // 使用vue-style-loader直接插入到style標簽中
            }
        ]
    },
})

定義生產配置.

webpack.prod.js:

const merge = require("webpack-merge");
const common = require("./webpack.common.js");
const MiniCssExtractPlugin = require("mini-css-extract-plugin")

module.exports = merge(common,{
    mode:"production", // 壓縮代碼
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"]
            },
            {
                test: /.css$/,
                use: [
                    {
                        loader:MiniCssExtractPlugin.loader // 提取css到外部文件中
                    },
                    "css-loader"
                ]
            }
        ]
    },
    plugins:[
        new MiniCssExtractPlugin({
            filename:"style.css"
        })
    ]
})

最后修改一下我們package.json中的快捷方式:

+++
"scripts": {
    "dev": "webpack --config webpack.dev.js",
    "build": "webpack --config webpack.prod.js"
},
+++

刪除之前的webpack.config.js.

完成后的目錄結構:

learnwebpack

dist

src

pages

app.vue

index.js

package.json

template.html

webpack.common.js

webpack.dev.js

webpack.prod.js

嘗試運行npm run devnpm run build吧.

簡單的代碼分離

我們在index.js中引用了Vue,如果你查看打包后的代碼你會發現vue本身會被打包到同一個文件中,如果我們有另外一個文件也引用了vue同樣的會被打包到該文件中.

顯然我們的代碼依賴vue,但是vue不應該存在兩份,如果可以將vue多帶帶提取出來就好了,這個問題就是要代碼分離.

在webpack4中刪除了原來的CommonsChunkPlugin插件,內部集成的optimization.splitChunks選項可以直接進行代碼分離.

修改webpack.dev.js:

const merge = require("webpack-merge");
const common = require("./webpack.common.js");

module.exports = merge(common, {
    mode: "development",
    devtool: "source-map",
    optimization:{ // +++
        splitChunks:{ // +++
            chunks:"initial" // +++ initial(初始塊)、async(按需加載塊)、all(全部塊)

        }
    },
    module: {
        rules: [
            {
                test: /.vue$/,
                use: ["vue-loader"]
            },
            {
                test: /.css$/,
                use: ["vue-style-loader","css-loader"]
            }
        ]
    },
})

我們要做的就是將打包后寫入到index.html的文件從目前的一個文件拆分成多個,并且寫入到index.html中.

也就是說在入口處分離代碼.

運行:

npm run dev

你會發現在dist目錄下多出了一個文件保存著vue,另外一個文件中保存著我們編寫的代碼.

參考

vue部分:

https://cn.vuejs.org/v2/guide...
https://vue-loader.vuejs.org/zh/
https://www.npmjs.com/package...

webpack部分:

https://webpack.docschina.org...
https://github.com/webpack-co...
https://github.com/jantimon/h...

參考的其他教程:

https://segmentfault.com/a/11...
https://segmentfault.com/a/11...
http://www.cnblogs.com/anani/...
https://blog.csdn.net/bubblin...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108557.html

相關文章

  • 為什么我不推薦你使用vue-cli創建腳手架?

    摘要:后來經過排查你會發現是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現在能找到自己手動創建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現在一般的做...

    trigkit4 評論0 收藏0
  • 關于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...

    sutaking 評論0 收藏0
  • 關于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...

    khs1994 評論0 收藏0
  • 帶你了解webpack

    摘要:根據依賴關系,按照配置文件把模塊函數分組打包成若干個。會隨著自身的的修改,而發生變化。只需要在命令行運行時帶上參數就搞定一些插件的廢除和替換廢棄了頂替者用屬性變化壓縮優化代碼分割,下面詳解還有一些新的插件,。 1. 前端工程化項目打包歷史 前端工程化之前的時代略過 1. 半自動執行腳本來壓縮合并文件 自從xmlhttprequest被挖掘出來,網頁能夠和服務端通訊,js能做的事越來越多...

    senntyou 評論0 收藏0

發表評論

0條評論

junbaor

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<