天天看點

Vue.js實戰——精簡webpack配置_31、現狀2、目标3、優化過程4、總結 6、參考資料:

1、現狀

     繼上次完成Vue.js實戰——架構搭建_2,發現自動生成的架構配置(包括編譯、打包、調試相關的)檔案過多(見下圖所示),既分散也不好了解,是以當時也沒有去解讀各個配置的含義。

Vue.js實戰——精簡webpack配置_31、現狀2、目标3、優化過程4、總結 6、參考資料:

今天就來精簡Vue.js項目使用的webpack配置,使之簡單易懂,降低出錯的成本。

2、目标

     把webpack配置檔案精簡成一個單獨的檔案,去掉備援且不太使用的配置,讓大夥能夠享受架構搭建的簡約之美。

3、優化過程

3.1 多個配置檔案優化成1個配置檔案

  1. 重新建立一個geolocation_2項目檔案夾,我們僅需要geolocation_1中的業務内容頁面(根路徑下的index.html檔案以及src下的所有内容)。
  2. 按照下述目錄結構對代碼進行整理(參考了網友整理的目錄結構):
|app
|--webpack.config.js  //webpack入口配置
|--package.json   //依賴json(基本上不需要管,隻有額外引庫時,可手動修改此問檔案引入,也可shell中執行npm指令引入)
|--|--dist    //打包之後根目錄,我們不用管
|--|--src  //源碼
|--|--|--commons  //非業務的核心公共元件(基礎)
|--|--|--components  //業務相關的元件(可引用commons的元件)
|--|--|--js  //頁面或者業務相關的js(非js庫)
|--|--|--lib  //js庫(部分js庫元件可能會包含Vue檔案)
|--|--|--pages  //多頁面,包括html頁面,vue頁面
|--|--|--assets //靜态資源,如圖檔等
           

對應此項目geolocation_2的目錄結構為:

Vue.js實戰——精簡webpack配置_31、現狀2、目标3、優化過程4、總結 6、參考資料:

3. 架構搭建階段,最重要的是要把基礎配置搞好,本人配置的webpack.config.js如下:

const path = require("path"); //node路徑處理子產品
const webpack = require('webpack'); //webpack必要條件   
const HtmlWebpackPlugin = require('html-webpack-plugin'); //多頁面生成視圖插件
const CleanWebpackPlugin = require('clean-webpack-plugin'); //清除工程目錄插件
const CompressionPlugin = require('compression-webpack-plugin'); //壓縮插件

module.exports = {
    //對象形式entry
    entry: {
        index: './src/js/main.js', //vue檔案綁定的js檔案,有多個寫多個
    },
    output: {
        path: path.resolve(__dirname, './dist'), //打包之後工程根目錄
        publicPath: '/static/', //html資源對應的server目錄
        filename: '[name].[hash].js', //每個頁面對應的js檔案
    },
    module: {
        rules: [{
                test: /\.css$/,
                use: ["vue-style-loader", "css-loader"]
            },
            {
                test: /\.vue$/, //.vue檔案處理
                loader: 'vue-loader',
                options: {
                    loaders: {}
                }
            },
            {
                test: /\.js$/, //es6轉es5處理
                loader: 'babel-loader',
                exclude: /node_modules/
            },
            {
                test: /\.(png|jpg|gif|svg)$/,
                loader: "file-loader",
                options: {
                    name: "[name].[ext]"
                }
            },
            {
                test: /\.html$/, //html打包,可有可無
                loader: 'html-loader',
                options: {}
            }
        ]
    },
    resolve: {
        alias: {
            vue$: "vue/dist/vue.esm.js"
        },
        extensions: ["*", ".js", ".vue", ".json"]
    },
    plugins: [
        new CleanWebpackPlugin(["dist"]), //建構dist之前清除老版目錄
        new HtmlWebpackPlugin({ //一個html檔案,有多個複寫多個HtmlWebpackPlugin
            filename: "index.html",
            template: "./src/pages/index.html",
            inject: true,
            chunks: ["index"]
        }),
    ],
    devServer: { //開發模式下使用的配置參數
        historyApiFallback: true,
        noInfo: true,
        overlay: true,
        contentBase: path.resolve(__dirname, "./src/assets") //本地調試時,圖檔等資源對應的根路徑
    },
    devtool: "#eval-source-map"
};

if (process.env.NODE_ENV === "production") { //生産環境,啟用相容和js壓縮處理
    module.exports.devtool = "#source-map";
    // http://vue-loader.vuejs.org/en/workflow/production.html
    module.exports.plugins = (module.exports.plugins || []).concat([
        new webpack.DefinePlugin({
            "process.env": {
                NODE_ENV: '"production"'
            }
        }),
        new webpack.optimize.UglifyJsPlugin({
            sourceMap: true,
            compress: {
                warnings: false
            }
        }),
        new webpack.LoaderOptionsPlugin({
            minimize: true
        }),
        new CompressionPlugin({
            filename: "[path].gz[query]",
            algorithm: "gzip",
            test: /\.js$/,
            threshold: 1024,
            minRatio: 0.8,
        })
    ]);
};

//DEV模式時,指定公共路徑為目前路徑
if (process.env.PLATFORM == "DEV") {
    module.exports.output.publicPath = "";
}
           

4. package.json檔案配置如下(預設dependencies下什麼依賴也不加,隻在devDependencies上加上如下配置,這樣可以做到業務元件和vue本身依賴的基礎元件的分離,同時有效控制項目最後打出的檔案的大小):

{
    "name": "justinsoft",
    "description": "A Vue.js project",
    "version": "1.0.0",
    "author": "[email protected]",
    "license": "MIT",
    "private": true,
    "scripts": {
        "dev": "cross-env NODE_ENV=development PLATFORM=DEV webpack-dev-server --open --hot",
        "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
    },
    "dependencies": {},
    "browserslist": [
        "> 1%",
        "last 2 versions",
        "not ie <= 8"
    ],
    "devDependencies": {
        "babel-core": "^6.26.3",
        "babel-loader": "^7.1.5",
        "babel-preset-env": "^1.7.0",
        "babel-preset-stage-3": "^6.24.1",
        "clean-webpack-plugin": "^0.1.19",
        "compression-webpack-plugin": "^1.1.12",
        "cross-env": "^5.0.5",
        "css-loader": "^0.28.11",
        "file-loader": "^1.1.11",
        "html-loader": "^0.5.5",
        "html-webpack-plugin": "^3.2.0",
        "vue": "^2.5.11",
        "vue-html-loader": "^1.2.4",
        "vue-i18n": "^8.0.0",
        "vue-loader": "^13.7.3",
        "vue-style-loader": "^4.1.2",
        "vue-template-compiler": "^2.5.11",
        "webpack": "^3.12.0",
        "webpack-dev-server": "^2.9.1",
        "babel-preset-es2015": "^6.24.1"
    }
}
           

5. 指令行進入geolocation_2目錄,通過執行shell指令編譯指令:npm run build,會出現“Unexpected token: punc (() ”報錯,原因是因為需要相容ES5文法,解決方案是:在目前根路徑下建立一個.babelrc檔案,内容如下:

{
  "presets": ["es2015"]
}
           

6. 按照步驟5解決所有的元件報錯依賴問題。如果有什麼問題解決不了,可以在網上搜下報錯的解決方案,也歡迎留言交流。

7. 完成上述步驟後,需要相應的調整vue/js檔案中互相引用的路徑錯誤問題,此處我就不一一講解了。大家可以從這裡檢視修改好了之後的Demo源碼。

3.2 解決Dev模式下本地相對圖檔路徑無法識别的問題

    在根路徑下執行npm run dev時,會動态生成一個html檔案和相對引用路徑,如上圖webpack.config.js中的publicPath路徑為:"/static/"。但是在開發模式下,我們圖檔的相對路徑無法加上該虛拟路徑,是以:

1)要在devServer中明确指定圖檔資源的相對路徑(見webpack.config.js中的contentBase參數配置);

2)要把dev的publicPath重置為目前的根路徑(見webpack.config.js最後一段配置,注意目前根路徑是"",而不是"./")

3.3 按照新架構重新釋出Demo

1. 大家可以從這裡下載下傳github管理的Vue.js實戰——精簡webpack配置_3源碼。

2.運作npm run dev後的效果圖如下:

Vue.js實戰——精簡webpack配置_31、現狀2、目标3、優化過程4、總結 6、參考資料:

4、總結

1. 從頭開始搭建一個項目的基礎架構,特别勞神費力,但是對于初學者尤為重要,因為這樣會培養對架構整體的認知,大體掌握平台架構和各個元件搭配的方方面面,然後可以再深入一一學習,各個擊破;

2.後續我會基于此精簡的架構,進一步講解如何通過前端程式設計來實作多媒體互動功能、元件抽象以及與各大平台對接方面的經驗,隻為初心。

上一篇:Vue.js實戰——架構搭建_2                                                   下一篇:Vue.js實戰——擷取浏覽器經緯度的各種坑_4

6、參考資料:

[1]https://blog.csdn.net/wbiokr/article/details/77170792

[2]https://blog.csdn.net/wbiokr/article/details/77171010

[3]https://www.cnblogs.com/toward-the-sun/p/6147324.html?utm_source=itdadao&utm_medium=referral

[4]https://segmentfault.com/a/1190000012383015

[5]https://www.cnblogs.com/zourong/p/5943224.html

[6]https://blog.csdn.net/goodboy1739/article/details/78547042?locationNum=7&fps=1

繼續閱讀