webpack前端模塊化打包工具(webpack打包css,url,babel等,配置Vue文件依賴,搭建本地服務器和發布項目)


注:本章將配合Vue詳細講解webpack

前提條件

1.在開始之前,請確保安裝了 Node.jsnpm的最新版本。使用舊版本,你可能遇到各種問題,因為它們可能缺少 webpack 功能以及/或者缺少相關 package 包。
cmdnode -v,npm -v可查看對應的版本和安裝情況。
2.這里會用到ES6的模塊化,如果你了解可以直接開始,不了解請看關於ES6模塊化的文章。
(作者會更新ES6模塊化)

webpack是什么

webpack可以理解成打包工具
webpack更強調的是模塊化。而文件合並,預處理等功能,是它附帶的功能。如果項目使用了模塊化管理,而且互相依賴非常強,我們就可以使用更強大的webpack

grunt/gulp更強調的是前端流程的自動化,模塊化不是它的核心如果你的工程模塊依賴非常簡單,甚至沒有用模塊化的概念,只需要簡單的進行合並,壓縮,就使用grunt/gulp

安裝webpack

// 安裝webpack
npm install webpack@3.6.0 -g

// 查看版本:
webpack -veison

// 清除node緩存:
npm cache clean -f

// 卸載全局:
npm uninstall webpack -g

安裝完成后就可以使用 webpack 將你的代碼打包。
打包代碼:
webpack ./src/main.js ./dist/bundle.js
webpack:參數1 參數2
參數1是你的入口文件(主文件)
參數2是打包后的文件目錄

打包后在目錄下 dist/bundle.js 就會產生一個bundle.js的文件,這個文件就是打包后的文件。

配置webpack.config.js:

首先創建你的項目文件夾 XXX
在項目下創建 webpack.config.js 並配置好以下內容:

const path = require('path');  //在node (全局) 中尋找 path 包

module.exports = {
    entry: './src/main.js',  //入口文件
    output: {    //出口文件
        path: path.resolve(__dirname, 'dist'),   //出口文件路徑
        filename: 'bundle.js'   //出口文件名字
    },
}

webpack.config.js 是這個項目的配置文件,所有配置以后都寫在這里面。

npm init 自動創建package.json

在項目終端目錄下 npm init:會幫助你安裝一個package.json的文件,如下:

npm init
{
  "name": "meetwebpack",    //項目名字
  "version": "1.0.0",       //版本
  "description": "",        //描述
  "main": "index.js",       //入口路徑
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "hollow",       //作者
  "license": "ISC"          //許可證
}

然后再 npm install 安裝依賴。
之后就可以直接用 webpack 打包項目,不在使用麻煩的寫 webpack ./src/main.js ./dist/bundle.js 打包了。

npm run build

作用:把 webpack 映射到 npm run build 上,用 npm run build 進行打包在 package.json 文件中的 "scripts" 中添加 "build": "webpack"。如下:

{
  "name": "meetwebpack",
  "version": "1.0.0", 
  "description": "",
  "main": "index.js", 
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack", //這里是新添加的
  },
  "author": "hollow",
  "license": "ISC"
}

npm run XXX 就是在 scripts 中找 XXX 然后執行后面的語句,例如 npm run build,就是執行了 webpack

npm install webpack@3.6.0 --save-dev

局部安裝 webpack :因為考慮到有些 clone 的項目和自己全局安裝的 webpack 版本不一樣從而導致打包失敗,所以每個項目都需要安裝局部 webpack

注:在使用局部打包的時候一定要用 npm run build 進行打包,因為npm run build 才會在本地 node_modules/bin 路徑中找命令進行打包,如果沒有找到,才會去全局的環境變量中尋找。

配置webpack css

1.在項目下安裝 css 依賴:

npm install --save-dev css-loader

2.修改 webpack.config.js rulse 文件,對 css 依賴進行配置。

module.exports = {
  module: {
    rules: [
      // css 文件打包配置
      {
        test: /\.css$/,
        // css-loader 解析 CSS 文件后,使用 import 加載,並且返回 CSS 代碼
        // style-loader 將模塊的導出作為樣式添加到 DOM 中
        // 使用多個loader時,是從右向左,所以stype-loader在css-loader前面
        use: [ 'style-loader', 'css-loader' ]
      }
    ]
  }
}

3.安裝 style 依賴(安裝這個依賴才能真正的將樣式添加到 DOM 上):

npm install --save-dev style-loader

4.在 main.js 中引用 css 文件:

require('./css/normall.css');

5.這時候才能真正的看到樣式被添加到了 DOM 上。

配置webpack less

1.安裝 less 依賴:

npm install --save-dev less-loader less

2.在 webpack.config.js rules 中進行 less 配置:

// less 文件打包配置
{
  test: /\.less$/,
  use: [{
    loader: "style-loader" // creates style nodes from JS strings
  }, {
    loader: "css-loader" // translates CSS into CommonJS
  }, {
    loader: "less-loader" // compiles Less to CSS
  }]
}

這時打包后的代碼就能識別 less 文件了。

配置webpack 圖片(url):

1.在項目下安裝圖片 (url) 依賴:

npm install url-loader --save-dev

2.在 webpack.config.js rules 中進行配置:

// 圖片打包配置
 {
  test: /\.(png|jpg|gif)$/,
  use: [
        {
          loader: 'url-loader',
          options: {
            // 當加載圖片小於limit時,會將圖片編譯成base64字符串形式
            // 當加載的圖片大於limit時,需要使用 file-loader 模塊進行加載
            limit: 8192
            name:'img/[name].[hash:8].[ext]'
          }
        }
    ]
 }

這時安裝配置 url 已經完成了,可以在 html 中添加一個 img 標簽測試

3.對於太大的圖片,我們建議安裝 file-loader

npm install file-loader --save-dev

4.如果打包出來的圖片沒有顯示並且網頁上的鏈接顯示 background: url([object Object]) 這是因為 file-loader 版本問題,所以對版本進行降級,替換的版本:

npm install file-loader@3.0.1 --save-dev -s

webpack ES6轉ES5的babel

1.在項目下安裝 ES6 語法處理的依賴:

npm install --save-dev babel-loader@7 babel-core babel-preset-es2015

2.在 webpack.config.js rules 中進行配置:

// webpack ES6轉ES5的配置
{
  test: /\.js$/,
  exclude: /(node_modules|bower_components)/,
  use: {
    loader: 'babel-loader',
    options: {
      presets: ['es2015']
    }
  }
}

3.這個時候在打包就會自動把 ES6 語法轉成 ES5 語法

配置 webpack Vue.js

1.在項目下的安裝Vue.js:

npm install vue --save

2.在 js 文件中導入 Vue :在導入中會自動去 node_modules 中去找 Vue 包,導入之后就能使用 Vue

import Vue from 'vue';

3.在 webpack.config.js 中配置 vue.js 的引用:

// 配置 Vue.js 的引用
resolve: {
  // alias:別名
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
    }
}

注:resolve、module、output、entry 是同一級別

webpack 配置 .vue 文件依賴

1.在項目下安裝 .vue 文件依賴:

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

2.在 webpack.config.js 中配置 .vue :

// .vue 文件的配置
{
  test:/\.vue$/,
  use:['vue-loader']
}

3.引用 .vue 文件:

import App from './vue/App.vue

webpack 配置 plugin(橫幅)

1.在 webpack.config.js 中配置 plugins
先引用 webpack

const webpack = require('webpack');  //在 node(全局) 中尋找 webpack 包——用來配置橫幅的(版權)

然后在 webpack.config.js 中添加 plugins

// 橫幅的配置(版權)
plugins:[
  new webpack.BannerPlugin('最終版權歸hollow所有'),
]

注:plugins、resolve、module、output、entry 是同一級別的

webpack 配置 HtmlWebpackPlugin

1.在項目下安裝 HtmlWebpackPlugin 依賴:

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

2.在 webpack.config.is 中配置 plugins
先引用 plugins:

const HtmlWebpackPlugin = require('html-webpack-plugin'); //在 node(全局) 中尋找 

然后在 plugins 中添加 new HtmlWebpackPlugin()

plugins:[
  new webpack.BannerPlugin('最終版權歸hollow所有'),
  new HtmlWebpackPlugin(),
]

3.讓 HtmlWebpackPlugin 根據模板來生成新的 html 文件:
因為新生成的文件沒有包含 <div id='app'></div>
所以我們要修改 webpack.config.js 中的 plugins 里的 new HtmlWebpackPlugin 來進行模板配置:

// 橫幅的配置(版權)
plugins:[
  new webpack.BannerPlugin('最終版權歸hollow所有'),
  new HtmlWebpackPlugin({
    template: 'index.html',
  }),
]

webpack 中配置 uglifyjsWebpackPlugin

1.在項目下安裝依賴:

npm install uglifyjs-webpack-plugin --save-dev

2.在 webpack.config.js 中配置 UglifyjsWebpackPlugin
先引用 UglifyjsWebpackPlugin

// 在mode(全局) 中尋找uglifyjs-webpack-plugin(用來壓縮js代碼的)
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin'); 

然后在 plugins 中添加 new UglifyjsWebpackPlugin()

plugins:[
  new webpack.BannerPlugin('最終版權歸hollow所有'),
  new HtmlWebpackPlugin({
    template: 'index.html',
  }),
  new UglifyjsWebpackPlugin(),
]

webpack-dev-server搭建本地服務器

1.在項目下安裝依賴:

npm install webpack-dev-server --save-dev 

2.在 webpack.config.js 中配置 devServer :

// 本地服務的配置
devServer: {
  contentBase:'./dist',
  inline:true,
}

注:devServer、plugins、resolve、module、output、entry是同一級別

3.在 package.json 中的 scripts 進行配置:

"dev":"webpack-dev-server --open"

加入這行代碼表示,以后只需要 npm run dev 就能進行測試我們修改過的代碼。如果沒有問題再 nmp run build 進行打包

注:--open 表示在 npm run dev 之后,會自動幫我們打開瀏覽器

webpack-配置文件的分離

1.在項目下建一個 build 的文件夾,並且在 build 文件夾中創建 base.config.jsdev.config.jsprod.config.js 文件

base.config.js

公共的東西放在這里面

// 公共的
const path = require('path');  //在node (全局) 中尋找 path 包——用來配置出口文件路徑的
const webpack = require('webpack');  //在 node(全局) 中尋找 webpack 包——用來配置橫幅的(版權)
const HtmlWebpackPlugin = require('html-webpack-plugin'); //在 node(全局) 中尋找 html-webpack-plugin 包(用來webpack自動幫我們生成一個最終html文件)

module.exports = {
    entry: './src/main.js',     //入口文件
    output: {      //出口文件
        path: path.resolve(__dirname, 'dist'),  //出口文件路徑
        filename: 'bundle.js',   //出口文件名字
        // publicPath: 'dist/'
      },
    module: {
        rules: [
            // css 文件打包配置
            {
              test: /\.css$/, 
            // css-loader 解析 CSS 文件后,使用 import 加載,並且返回 CSS 代碼
            // style-loader 將模塊的導出作為樣式添加到 DOM 中
            // 使用多個loader時,是從右向左,所以stype-loader在css-loader前面
              use: [ 'style-loader', 'css-loader' ]   
            },
            // less 文件打包配置
            {
              test: /\.less$/,
              use: [{
                  loader: "style-loader" // creates style nodes from JS strings
              }, {
                  loader: "css-loader" // translates CSS into CommonJS
              }, {
                  loader: "less-loader" // compiles Less to CSS
              }]
            },
            // 圖片打包配置
            {
              test: /\.(png|jpg|gif)$/,
              use: [
                {
                  loader: 'url-loader',
                  options: {
                    // 當加載圖片小於limit時,會將圖片編譯成base64字符串形式
                    // 當加載的圖片大於limit時,需要使用 file-loader 模塊進行加載
                    limit: 8192,
                    name:'img/[name].[hash:8].[ext]'
                  },
                }
              ]
            },
            // webpack ES6轉ES5的配置
            {
              test: /\.js$/,
              exclude: /(node_modules|bower_components)/,
              use: {
                loader: 'babel-loader',
                options: {
                  presets: ['es2015']
                }
              }
            },
            // .vue 文件的配置
            {
              test:/\.vue$/,
              use:['vue-loader']
            }
            
        ]
    },
    // 配置 Vue.js 的引用
    resolve: {
      // alias:別名
      alias: {
        'vue$': 'vue/dist/vue.esm.js',
      }
    },
    // 橫幅的配置(版權)
    plugins:[
      new webpack.BannerPlugin('最終版權歸hollow所有'),
      new HtmlWebpackPlugin({
        template: 'index.html',
      }),
    ],
}

dev.config.js

開發時依賴的東西放在這里面

// 開發時依賴的
module.exports = {
  devServer: {
    contentBase:'./dist',
    inline:true,
  }
}

prod.config.js

編譯時依賴的東西放在這里面

// 編譯時依賴的
const UglifyjsWebpackPlugin = require('uglifyjs-webpack-plugin'); // 在mode(全局) 中尋找uglifyjs-webpack-plugin(用來壓縮js代碼的)
module.exports = {
  plugins:[
    new UglifyjsWebpackPlugin(),
  ],
}

2.在項目文件下安裝 webpack-merge 依賴:

npm install webpack-merge@4.1.5 --save-dev

3.在 prod.comfig.js 中配置 webpackMergebaseConfig
先導入依賴:

const webpackMerge = require('webpack-merge');
const baseConfig = require('./base.config');

然后再配置依賴:

module.exports = webpackMerge(baseConfig, {
  plugins:[
    new UglifyjsWebpackPlugin(),
  ],
})

4.在 dev.config.js 中配置 webpackMergebaseConfig
先導入依賴:

const webpackMerge = require('webpack-merge');
const baseConfig = require('./base.config');

然后再配置依賴:

module.exports = webpackMerge(baseConfig, {
  devServer: {
    contentBase:'./dist',
    inline:true,
  }
})

5.修改 package.jsonscripts 的配置:

"build": "webpack --config ./build/prod.config.js",
"dev": "webpack-dev-server --open --config ./build/dev.config.js"

6.修改 base.config.jsoutputpath 的路徑:

output: {      //出口文件
  path: path.resolve(__dirname, '../dist'),  //出口文件路徑
  filename: 'bundle.js',   //出口文件名字
  // publicPath: 'dist/'
},

下一篇 Vue-cli

Vue-cli會自動幫我們生成上面所有的代碼,不用我們一個個去單獨配置

上一篇:Vue組件化開發
下一篇:Vue-cli


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM