手動webpack vue項目的配置一

初始化項目

1.創(chuàng)建工程文件夾
2.npm init 初始化npm項目
3.安裝所需要的包
npm i webpack vue vue-loader
安裝后會有提醒更具提醒安裝依賴即可.
基于webpack3所需依賴(npm i css-loader vue-template-compiker

4.新建文件夾client文件夾源碼放置的目錄


我的工程目錄.png
  • 新建app.vue文件作為root文件
  • 新建一個index.js作為工程的入口文件
  • 新建assets文件夾 內(nèi)部再創(chuàng)建images和styles文件夾
    里面可以放需要使用的圖片和css
//index.js
import Vue from 'vue'
import App from './app.vue'

const root = document.createElement('div')
document.body.appendChild(root)
new Vue({
  render: (h) => h(App)
}).$mount(root)

5.新建一個build作為配置文件夾

  • 創(chuàng)建3個文件
    vue-loader.config.js vue-loader的配置文件
    webpack.config.base.js 公共配置文件
    webpack.config.client.js 具體客戶端配置文件
    5.1 配置 vue-loader.config.js
// const docsLoader = require.resolve('./doc-loader')
module.exports = (isDev) => {
  return {
    preserveWhitepace: true, // 去除空格
    extractCSS: !isDev,
    // 默認vue文件的css是不打包出來的,需要的話加true
    // 正是環(huán)境就只是bsae64
    cssModules: {
      localIdentName: isDev ? '[path]-[name]-[hash:base64:5]' : '[hash:base64:5]',
      camelCase: true //命名 轉(zhuǎn)換。比如 。class-header => classHeader
    }
   // 下面的基本不用
    // hotReload:isDev  //熱重載 是否開啟
    // loaders: { //自定義模塊指定loader
    //     'docs':docsLoader
    // },
    // preLoader:
    // {
    //解析完之前在解析
    // },
    // postLoader:{
        //解析完之后
    // }
  }
}

5.2配置 webpack.config.base.js

const path = require('path')
const createVueLoaderoptions = require('./vue-loader.config')

const isDev = process.env.NODE_ENV === 'development'

const config = {
  target: 'web',
  //1.設置入口和出口
  entry: path.join(__dirname, '../client/index.js'),
  output: {
    filename: 'bundle.[hash:8].js',
    path: path.join(__dirname, '../dist')
  },
  module: {
  //2. 加載前端需要使用的所有靜態(tài)資源
 //2.1 指定文件使用指定loader
    rules: [
       // { 因為我是用stylus 寫css所以就不需要這個配置了
       //  test: /\.css$/,
       // use: [
       //    'style-loader',
      //      'css-loader'
      //    ]
      // },
     // {
       // test: /\.styl/,
        //  use: [
        // 一層層解析成我們需要的css
        // 不在這里寫是因為需要優(yōu)化 區(qū)分開發(fā)環(huán)境和正式環(huán)境
         //  'style-loader',
         //   'css-loader',
         //   'stylus-loader'
         // ]
        //}
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: createVueLoaderoptions(isDev)
      },
      {
        test: /\.jsx$/,
        loader: 'babel-loader'
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/
        // 忽略已經(jīng)編譯過的js
      },
      {
        //直接把圖片轉(zhuǎn)換成base64代碼 減少http請求
        test: /\.(gif|jpg|jpeg|png|svg)$/,
        use: [
          {
            loader: 'url-loader',
            options: { //指定loader的操作方式
              limit: 1024,
              //指定輸出文件名字
              name: 'resources/[path][name].[hash:8].[ext]'
            }
          }
        ]
      }
    ]
  }
}
module.exports = config

//`npm i style-loader url-loader file-loader`
//安裝后可以使用 import './assets/styles/global.styl' 進行//引入 放在index.js 的話表示全局引入
//`npm i stylus-loader stylus` 使用stylus寫css需要安裝

// npm i postcss-loader autoprefixer babel-loader balel-core
// npm i babel-preset-env babel-plugin-transform-vue-jsx
// (webpack3依賴 npm babel-helper-vue-jsx-merge-props babel-plugin-syntax-jsx)

// 創(chuàng)建 .babelrc   轉(zhuǎn)換vue里面的jsx代碼
// 創(chuàng)建 postcss.config.js

.babelrc 識別vue內(nèi)部的jsx代碼

{
  "presets": [
    "env"
  ],
  "plugins": [
    "transform-vue-jsx"
  ]
}

postcss.config.js 優(yōu)化代碼

const autoprefixer = require('autoprefixer')

module.exports = {
  plugins: [
    autoprefixer()
  ]
}
// 自動加前綴 優(yōu)化代碼 還有其他的自行百度

5.3配置 webpack.config.client.js

const path = require('path')
const webpack = require('webpack')
const HTMLPlugin = require('html-webpack-plugin')
const merge = require('webpack-merge') // 合并配置的插件
const ExtractPlugin = require('extract-text-webpack-plugin')

const baseConfig = require('./webpack.config.base')

//  環(huán)境變量的設置
const isDev = process.env.NODE_ENV === 'development'

// 要加入服務端渲染
// 所以 不加入base

// 
const defaultPlugins = [
  // 編譯過程中判斷 環(huán)境 開發(fā)環(huán)境 錯誤提示
  // 正式環(huán)境打包所需的內(nèi)容 提高程序的運行效率 而不是全部打包
  new webpack.DefinePlugin({
    'process.env': {
      NODE_ENV: isDev ? '"development"' : '"production"'
    }
  }),
  new HTMLPlugin()
]

// 
const devServer = {
  port: 5900,
  host: '0.0.0.0', // 可以通過ip訪問
  overlay: {
    // 編譯過程出現(xiàn)錯誤 顯示出來
    errors: true
  },
  // historyFallback: {

  // },
  hot: true
}

let config

if (isDev) {
  config = merge(baseConfig, {
    // 幫助我們調(diào)試代碼
    devtool: '#cheap-module-eval-source-map',
    module: {
      rules: [{
        test: /\.styl/,
        use: [
          'vue-style-loader',
          'css-loader',
          // {
          //    loader: 'css-loader',
          //     options: {
          //         module:true,
          //         localIdentName: isDev ? '[path]-[name]-[hash:base64:5]' : '[hash:base64:5]'
          //     }
          // },
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true
            }
          },
          'stylus-loader'
        ]
      }]
    },
    devServer,
    plugins: defaultPlugins.concat([
      // 2.1 啟動熱加載的插件
      new webpack.HotModuleReplacementPlugin(),
      new webpack.NoEmitOnErrorsPlugin()
    ])
  })
} else {
  config = merge(baseConfig, {
    entry: {
      app: path.join(__dirname, '../client/index.js'),
      vendor: ['vue']
      // 單獨打包類庫
    },
    output: {
      filename: '[name].[chunkhash:8].js'
    },
    module: {
      rules: [{
        test: /\.styl/,
        use: ExtractPlugin.extract({
          fallback: 'vue-style-loader', // 是把css用js代碼包裝 把css代碼到html里面
          use: [
            'css-loader',
            {
              loader: 'postcss-loader',
              options: {
                sourceMap: true
              }
            },
            'stylus-loader'
          ]
        })
      }]
    },
    plugins: defaultPlugins.concat(
      [ // 指定輸出內(nèi)容的名字
        new ExtractPlugin('styles.[contentHash:8].css'),
        // 單獨打包類庫代碼
        new webpack.optimize.CommonsChunkPlugin({
          name: 'vendor'
        }),
        // webpack 相關(guān)代碼打包到一個文件
        // 新模塊加入給新模塊加一個id
        // 規(guī)避長緩存問題
        new webpack.optimize.CommonsChunkPlugin({
          name: 'runtime'
        })
      ])
  })
}
module.exports = config

// 1.1npm i webpack-dev-server
// 1.2npm i cross-env  設置環(huán)境變量 區(qū)分開發(fā)環(huán)境和正式環(huán)境
// 1.3npm i html-webpack-plugin 
// 1.4npm i vue-style-loader -D   處理熱更新的依賴

// npm i extract-text-webpack-plugin 把非js 代碼 打包成單獨文件

// 單獨打包類庫代碼
// chunkhash每一個異步加載的東西都會單獨生成一個hash
// hash所以打包js都是同一個hash

// npm webpack-merge 合并webpack的配置
//npm i rimraf -D 配置build過程刪除之前的dist文件

vue-loader自定義模塊 使用

<template>
  <div></div>
</template>
<docs>
#123 = 456
<docs>

vue-loader 的cssModules功能使用

<template>
  <header :class="$style.mainHeader">
    <h1>JTodo</h1>
  </header>
</template>

<style lang="stylus" module>
.main-header{
  text-align center
  h1{
    font-size 100px
    color: rgba(175, 47, 47, 0.4)
    font-weight 100
    margin 20px
  }
}
</style>

外部引入的css 使用module jsx文件為例子

import className from '../assets/styles/footer.styl'
export default {
  data () {
    return {
      author: 'Jokcy'
    }
  },
  render () {
    return (
      // <div id="footer">
      //   <span>Written by {this.author}</span>
      // </div>
      <div id={className.footer}>
        <span>Written by {this.author}</span>
      </div>
    )
  }
}

npm 命令的配置

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build:client": "cross-env NODE_ENV=production webpack --config build/webpack.config.client.js",
    "dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js",
    "build": "npm run clean && npm run build:client",
    "clean": "rimraf dist"
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,104評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,647評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,130評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,366評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,737評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,174評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,608評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,914評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 1 Webpack 1.1 概念簡介 1.1.1 WebPack是什么 1、一個打包工具 2、一個模塊加載工具 3...
    Kevin_Junbaozi閱讀 6,697評論 0 16
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 webpack介紹和使用 一、webpack介紹 1、由來 ...
    it筱竹閱讀 11,202評論 0 21
  • 我剛剛來了美斯樂公司就職還不到半個月的我,老板就說,“明天的培訓加上梁毅老師”,就在這樣的情形下,我既不知道是要去...
    藝_ee84閱讀 264評論 0 0
  • 1.mongodb特性1)mongo是一個面向文檔的數(shù)據(jù)庫,它集合了nosql和sql數(shù)據(jù)庫兩方面的特性。2)所有...
    馬貞曉閱讀 399評論 0 1
  • 第五章:誰敢說系統(tǒng)沒文化…… 站在驚鴻樓外,林炬很苦惱,他如何能在36秒在樓里打個來回?十層呀!...
    水寸稍閱讀 199評論 0 0