9102年webpack4搭建vue項目(二)

前言

距離上篇文章9102年webpack4搭建vue項目已通過了將近兩個月了,一直沒有時間寫文章,公司項目比較多,這兩個月一直在加班,因此呢,因此呢,直到今天才能給你們分享文章,想看上篇文章的同窗點這裏juejin.im/post/5c665d…css

好了廢話很少說開始擼代碼。html

1.新建文件夾

mkdir wepack-vue //文件名字能夠隨便複製代碼

2.新建package.json文件

npm init -y複製代碼

3.webpack配置

新建build文件夾vue

mkdir build複製代碼

build文件夾新建webpack.base.conf.js,webpack.dev.conf.js,webpack.prod.conf.jsnode

  • webpack.base.conf.js 存放公共配置
  • webpack.prod.conf.js 存放生產環境配置
  • webpack.dev.conf.js 存放開發環境配置

建立src文件夾並建立main.jswebpack

建立index.htmlgit

<!DOCTYPE html>
<html lang="en">
<head>    
    <meta charset="UTF-8">    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">    
    <meta http-equiv="X-UA-Compatible" content="ie=edge">    
    <title>webpack搭建vue項目</title>
</head>
<body>
    <div id="app"></div>
</body>
</html>複製代碼

下載webpack webpack-dev-server webpack-cligithub

npm i webpack webpack-dev-server webpack-cli -D複製代碼

打開webpack.base.config.js,並配置webpack總體屬性
web

var path = require('path');
var webpack = require('webpack');
module.exports = {
    entry: {
        main: path.resolve(__dirname, '../src/main.js')
    },
    output: {
        path: path.resolve(__dirname, '../src'),
        filname: '[name].[bash].js',
    },
    module: {
        rules: []
    },
    pligins: [
                new webpack.HashedModuleIdsPlugin(), // 解決vender後面的hash每次都改變
             ],
    resolve: {

    }
}複製代碼

4.配置loader

  • 下載babel-loader,babel-core,babel-preset-dev,rules並配置js

babel-preset-env 幫助咱們配置 babel。咱們只須要告訴它咱們要兼容的狀況(目標運行環境),它就會自動把代碼轉換爲兼容對應環境的代碼。
npm

babel-core是做爲babel的核心存在,babel的核心api都在這個模塊裏面
json

tips: babel是7.X的話babel-core必須是6.X,不然不兼容

npm i babel-loader@7 babel-core babel-preset-env -D複製代碼

rules:[
    {
        test: /\.js$/,
        use: ['babel-loader'],
        exclude: /node_modules/
    }
]複製代碼
  • 新建.babelrc文件,.babelrc是babel全局配置文件

{
    "preset": [
                ['env',{
                        "targets":  {// 指定轉譯到那個環境
                            //瀏覽器環境                            
                            "browsers": ["> 1%", "last 2 versions", "not ie <= 8"],
                        },
                        //是否將ES6的模塊化語法轉譯成其餘類型
                        "modules": false
                 }]
            ]
}複製代碼

  • 下載file-loader,rules並配置文件(圖片和字體)

npm i file-loader -D複製代碼

rules:[
    {
        test: /\.(jpg|png|svg|gif)$/,
        use: ['file-loader']
    },
  {
        test: '/\.(woff|woff2|eot|ttf|otf)$/',
        use: ['file-loader']
   },]複製代碼
  • 下載css-loader,vue-style-loader,sass-loader, node-sass,並配置css,scss,sass

npm i css-loader vue-style-loader sass-loader node-sass -D複製代碼

rules:[
    {
        test: /\.(sa|sc|c)ss$/,
        use: [
                {loader: 'vue-style-loader'},
                'css-loader',
                'sass-loader'
              ]
    },
  ]複製代碼

  • 下載less,less-loader,並配置less

npm i less-loader less -D複製代碼

rules:[
    {
        test: /\.less$/,
        use: [
                {loader: 'vue-style-loader'},
                'css-loader',
                'less-loader'
              ]
    },
  ]複製代碼

5.生成html文件

  • 下載html-webpack-plugin,並配置

npm i html-webpack-plugin -D複製代碼

// 引入html-webpack-plugin
var HtmlWebpackPlugin = require('html-webpack-plugin');
plugins: [
    new HtmlWebpackPlugin({
        template: path.resolve(__diename, '../index.html')
    }),
]複製代碼

6.配置解析模塊

resolve: {
    // 可以使用戶在引入模塊時不帶擴展
    extensions: ['.js', '.json', '.vue', 'css']
}複製代碼

base模塊配置了一些東西但沒有配置完,會在後邊一點一點加上,接下來配置dev和prod

7.配置webpack.dev.conf

  • 下載 webpack-merge

npm i webpack-merge -D複製代碼

  • webpack.dev.js

var merge = require('webpack-merge');
var baseConfig = require('./webpack.base.conf');
var path = require('path');
var webpack = reuire('webpack');
module.exports = merge(baseConfig, {
    devtool: 'inline-source-map', // 壓縮方式
    mode: 'development'
    devServer: {
     hot: true, // 熱更新
     open: true, // 自動打開頁面
     contentBase: path.resolve(__dirname, '../dist'), // 告訴服務從哪提供內容
    },
    plugins: [
        new.webpack.HotModuleReplacementPlugin(), //開啓熱更新
    ]
})複製代碼

8.配置webpack.prod.conf

  • webpack.prod.conf.js

var merge = require('webpack-merge');
var baseConfig = require('./webpack.base.conf');
var path = require('path');
var webpack = reuire('webpack');
module.exports = merge(baseConfig, {
    devtool: 'source-map', // 壓縮方式
    mode: 'production'
    plugins: [
    ]
})複製代碼

9.配置vue-loader

  • 下載vue-loader,vue,vue-template-compiler, 並配置vue解析文件,配置webpack.base.cond.js

npm i vue vue-loader vue-template-compiler -D
複製代碼

var VueLoaderPlugin = require('vue-loader/lib/plugin');
// 省略代碼......
rules:[
    {
        test: /\.vue$/,
        use: ['vue-loader'],
        exclude: /node_modules/
    },
  ]
// 省略代碼.......複製代碼

// 省略代碼....
plugins: [
    new VueLoaderPlugin(), // 它的職責是將你定義過的其它規則複製並應用到 .vue 文件裏相應語言的塊
]
// 省略代碼...複製代碼

  • 配置vue別名,確保webpack能夠找到.vue文件

// 省略代碼...
reslove: {
    alias: [
        'vue$': 'vue/dist/vue.esm.js', //配置別名 確保webpack能夠找到.vue文件
        '@': path.resolve(__dirname, '../src')
    ]
}複製代碼

  • 新建App.vue文件

<template>
    <div>{{str}}</div>
</template>
<script>
export default {
  name: 'App',
  data () {
    return {
      str: 'hello'
    }
  }}
</script>
<style>
div {
  color: red;
}
</style>
複製代碼

  • 在main.js中引入vue

import VUe from 'vue'
import App from './App'

new Vue({
    el: "#app",
    render: (h) => h(App)
})複製代碼

10.配置命令

  • 找到package.json文件,並配置開發和打包命令

// 省略代碼。。。
"scripts": {
  "dev": "webpack-dev-server --progress --config build/webpack.dev.conf.js",
   "build": "webpack --config build/webpack.prod.conf.js"
  }複製代碼

  • 運行項目

npm run dev複製代碼

能夠看到項目已經跑起來了


11. 區分環境引入不一樣地址

  • 新建config文件夾並新建dev.ev.js和prod.env.js

dev.env.js 開發環境配置

'use strict'

module.exports = {
    NODE_ENV: '"development"',
    BASE_API: '"http://1456"',
}複製代碼

prod.env.js 生產環境配置

'use strict'

module.exports = {
    NODE_ENV: '"production"',    BASE_API: '"http://123.com"',
}複製代碼

12.優化webpack配置

  • 解決更改文件打包時dist文件沒有清除,再次打包。

下載clean-webpack-plugin,並配置webpack.prod.conf.js文件

npm i clean-webpack-plugin -D複製代碼

// 引入clean-webpack-plugin
var CleanWebpackPlugin = require('clean-webpack-plugin');
// 省略代碼。。。。
plugins: [
    new CleanWebPackPlugin();
]複製代碼

  • 根據不一樣環境提取css

下載mini-css-extract-plugin,並配置webpack.prod.conf.js文件

npm i mini-css-extract-plugin -D複製代碼

更改webpack.prod.conf.js中使用vue-style-loader的代碼,更改成

module: {
        rules: [
            {
                test: /\.(c|sc|sa)ss$/,
                use: [
                  {
                    loader: MiniCssExtractPlugin.loader,
                  },
                  'css-loader',
                  'sass-loader'
                ]
            },
            {
            test: /\.less$/,
            use: [
                {
                loader: MiniCssExtractPlugin.loader,
                },
                'css-loader',
                'less-loader'
                ]
            }
        ]
    },
複製代碼

在webpack.prod.conf.js的plugin中配置

new MiniCssExtractPlugin({
    filename: '[name].[hash].js'
})複製代碼

webpack.base.conf.js中刪除使用vue-style-loader的代碼,並在webpack.dev.conf.js中定義

module: {
    rules: [
      {
        test: /\.(c|sc|sa)ss$/,
        use: [
          {
            loader: 'vue-style-loader',
          },
          'css-loader',
          'sass-loader'
        ]
      },
      {
        test: /\.less$/,
        use: [
          {
            loader: 'vue-style-loader',
          },
          'css-loader',
          'less-loader'
         ]
      }
    ]
  },複製代碼

這個配置vue-loader中有提到vue-loader.vuejs.org/zh/guide/ex…

  • 第三方庫單獨打包

把依賴的第三方庫抽取出來單獨打包,加快打包進度

下載autodll-webpack-plugin

npm i autodll-webpack-plugin -D複製代碼

在webpack.base.conf.js中配置

var AutodllWebpackpackPlugin = require('autodll-webpack-plugin');
plugins: [
    new AutodllWebpackpackPlugin ({
        inject: true,
        debugger: true,
        filename: '[name].js',
        path: './dll',
        entry: {
            vendor: ['vue']
        }
    })
]複製代碼

tips: inject 爲 true,插件會自動把打包出來的第三方庫文件插入到 HTML。 filename 是打包後文件的名稱。 path 是打包後的路徑。 entry 是入口, vendor 是你指定的名稱,數組內容就是要打包的第三方庫的名稱,不要寫全路徑,Webpack 會自動去 node_modules 中找到的。
  • 提取公共代碼

在 webpack.base.conf.js的 plugins 屬性中添加以下插件對象

new webpack.optimize.SplitChunksPlugin()複製代碼
  • 打包時壓縮js和css

下載optimize-css-assets-webpack-plugin和uglifyjs-webpack-plugin

npm i uglifyjs-webpack-plugin uglifyjs-webpack-plugin -D複製代碼

在webpack.prod.conf.js中分別引入optimize-css-assets-webpack-plugin和uglifyjs-webpack-plugin並增長optimization

var OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
var UglifyJsPlugin = require("uglifyjs-webpack-plugin");
// ...省略號 
    optimization: {
                minimizer: [
          // 壓縮JS
          new UglifyJsPlugin({
            uglifyOptions: {
              compress: {
                warnings: false, // 去除警告
                drop_debugger: true, // 去除debugger
                drop_console: true // 去除console.log
              },
            },
            cache: true, // 開啓緩存
            parallel: true, // 平行壓縮
            sourceMap: false // set to true if you want JS source maps
          }),
          // 壓縮css
          new OptimizeCSSAssetsPlugin({})
        ]
    },複製代碼

  • css自動加前綴

下載postcss-loader 和autoprefixer

npm i postcss-loader autoprefixer -D複製代碼

分別在webpack.dev.conf.js和webpack.prod.conf.js的use中添加postcss-loader

use: [
    'postcss-loader'
]複製代碼

在項目下增長postcss.config.js

// 配置cssz加前綴
module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}複製代碼

以上配置的項目就能夠跑起來了,謝謝你們,若有錯誤,敬請指出,一塊兒在碼農的道路上越走越遠

感恩騙點star項目地址github.com/mr-mengbo/w…

佔位

下一篇會介紹vue搭建後臺項目

相關文章
相關標籤/搜索