手动webpack vue项目的配置一

初始化项目

1.创建工程文件夹
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文件夹 内部再创建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作为配置文件夹

  • 创建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
    // 正是环境就只是bsae64
    cssModules: {
      localIdentName: isDev ? '[path]-[name]-[hash:base64:5]' : '[hash:base64:5]',
      camelCase: true //命名 转换。比如 。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. 加载前端需要使用的所有静态资源
 //2.1 指定文件使用指定loader
    rules: [
       // { 因为我是用stylus 写css所以就不需要这个配置了
       //  test: /\.css$/,
       // use: [
       //    'style-loader',
      //      'css-loader'
      //    ]
      // },
     // {
       // test: /\.styl/,
        //  use: [
        // 一层层解析成我们需要的css
        // 不在这里写是因为需要优化 区分开发环境和正式环境
         //  '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/
        // 忽略已经编译过的js
      },
      {
        //直接把图片转换成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)

// 创建 .babelrc   转换vue里面的jsx代码
// 创建 postcss.config.js

.babelrc 识别vue内部的jsx代码

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

postcss.config.js 优化代码

const autoprefixer = require('autoprefixer')

module.exports = {
  plugins: [
    autoprefixer()
  ]
}
// 自动加前缀 优化代码 还有其他的自行百度

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')

//  环境变量的设置
const isDev = process.env.NODE_ENV === 'development'

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

// 
const defaultPlugins = [
  // 编译过程中判断 环境 开发环境 错误提示
  // 正式环境打包所需的内容 提高程序的运行效率 而不是全部打包
  new webpack.DefinePlugin({
    'process.env': {
      NODE_ENV: isDev ? '"development"' : '"production"'
    }
  }),
  new HTMLPlugin()
]

// 
const devServer = {
  port: 5900,
  host: '0.0.0.0', // 可以通过ip访问
  overlay: {
    // 编译过程出现错误 显示出来
    errors: true
  },
  // historyFallback: {

  // },
  hot: true
}

let config

if (isDev) {
  config = merge(baseConfig, {
    // 帮助我们调试代码
    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(
      [ // 指定输出内容的名字
        new ExtractPlugin('styles.[contentHash:8].css'),
        // 单独打包类库代码
        new webpack.optimize.CommonsChunkPlugin({
          name: 'vendor'
        }),
        // webpack 相关代码打包到一个文件
        // 新模块加入给新模块加一个id
        // 规避长缓存问题
        new webpack.optimize.CommonsChunkPlugin({
          name: 'runtime'
        })
      ])
  })
}
module.exports = config

// 1.1npm i webpack-dev-server
// 1.2npm i cross-env  设置环境变量 区分开发环境和正式环境
// 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"
  }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 1 Webpack 1.1 概念简介 1.1.1 WebPack是什么 1、一个打包工具 2、一个模块加载工具 3...
    Kevin_Junbaozi阅读 6,550评论 0 16
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 webpack介绍和使用 一、webpack介绍 1、由来 ...
    it筱竹阅读 10,933评论 0 21
  • 我刚刚来了美斯乐公司就职还不到半个月的我,老板就说,“明天的培训加上梁毅老师”,就在这样的情形下,我既不知道是要去...
    艺_ee84阅读 238评论 0 0
  • 1.mongodb特性1)mongo是一个面向文档的数据库,它集合了nosql和sql数据库两方面的特性。2)所有...
    马贞晓阅读 377评论 0 1
  • 第五章:谁敢说系统没文化…… 站在惊鸿楼外,林炬很苦恼,他如何能在36秒在楼里打个来回?十层呀!...
    水寸稍阅读 176评论 0 0