使用webpack搭建一个vue-cli

(一)vue-cli的工作原理

本质是一个下载器,官方叫做启动器,帮助我们快速建立一个基本项目,根据你的选择建立起一个基本的框架。

最重要的是各种loader,浏览器不认识Vue,各种各样的loader将webpack不认识的文件转成认识的文件,比如js

plugin: 插件,扩展功能

主要是webpack,webpack熟练的话就可以自己搭建一个vue-cli

(二)使用webpack搭建vue-cli

(1)新建文件夹 初始化

npm init -y

(2)安装webpack、webpack-cli

npm i webpack webpack-cli --save

(3)创建index.html,在根目录下

创建一个div,id 是 app

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue-cli</title>
</head>
<body>
  <div id="app"></div>
</body>
</html>

(4)根目录下创建 main.js

main.js 主要做两件事

1)创建vue根实例

需要下载vue

npm i vue --save

2)挂载App组件

代码:

// 创建vue根实例
import Vue from 'vue'
// 引入App组件
import App from './App.vue'
new Vue({
  el: '#app',
  components: {
    App
  },
  template: '<App/>' // 挂载App组件
})

(5)webapck配置(webpack.config.js)

下载的插件:vue-loader、vue-template-compiler(模板编译)、css-loader、babel-loader、@babel/core、file-loader、vue-style-loader、url-loader、style-loader、sass-loader、node-sass、html-webpack-plugin、clean-webpack-plugin、postcss-loader、autoprefixer、webpack-dev-server、webpack-merge、@babel/preset-env

备注:

1)安装 vue-template-compiler 的时候,会提示手动需要安装下css-loader

2)postcss-loader:自动加浏览器样式前缀,要写在 css-loader的后面,先加前缀,在解析css

3)source-map 的作用:建立打包后的文件与源代码所在行的映射

代码:

App.vue

<template>
  <div>
    <div class="title">this is app</div>
  </div>
</template>

<script>
import logo from './src/assets/img/logo.png'
import './index.css'
export default {
  created () {
    console.log(logo)
    const result = [1, 2].map((item) => {
      return item + 1
    })
    console.log(result)
  }
}
</script>

<style scoped lang="scss">
.title {
  color: red;
}
</style>

index.css:

div {
  border: 1px solid red;
  transform: translate(50%);
}

 index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>vue-cli</title>
</head>
<body>
  <div id="app"></div>
</body>
</html>

index.js:

// 创建vue根实例
import Vue from 'vue'
// 引入App组件
import App from './App.vue'
new Vue({
  el: '#app',
  components: {
    App
  },
  template: '<App/>' // 挂载App组件
})

 webpack.config.js:

const path = require('path')
const vueLoaderPlugin = require('vue-loader/lib/plugin') // 这个路径下的插件
const htmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
const webpack = require('webpack')
module.exports = {
  devtool: 'source-map', // source-map
  mode: 'development',
  entry: './index.js',
  output: {
    filename: 'bundle.js',
    path: path.join(__dirname, 'dist')
  },
  module: {
    rules: [{
      test: /\.vue$/,
      loader: 'vue-loader'
    }, {
      test: /\.js$/,
      loader: 'babel-loader',  // 它会应用到普通的 `.js` 文件
      // 以及 `.vue` 文件中的 `<script>` 块
      exclude: /node_modules/
    }, {
      test: /\.css$/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            // 开启 CSS Modules
            modules: true
          }
        },
        'postcss-loader'
      ] // 它会应用到普通的 `.css` 文件
      // 以及 `.vue` 文件中的 `<style>` 块
    }, {
      test: /\.(png|gif|jpg|jpeg|svg)$/,
      use: [{
        loader: 'file-loader',
        options: {
          name: '[name].[ext]',
          outputPath: 'image'
        }
      }]
    }, {
      test: /\.scss$/,
      use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']
    }]
  },
  plugins: [
    new vueLoaderPlugin(),
    new htmlWebpackPlugin({
      template: './index.html',
      filename: 'index.html'
    }),
    new CleanWebpackPlugin(),
    new webpack.HotModuleReplacementPlugin() // 热更新
  ],
  resolve: {
    alias: {
      'vue': 'vue/dist/vue.js'
    }
  },
  devServer: {
    contentBase: './dist',
    open: true,
    port: 8080,
    compress: true,
    hot: true // 开启热模块更新
  }
}

postcss.config.js:

module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}

.babelrc:

{
  "presets": [
    [
      "@babel/preset-env"
    ]
  ]
}

 

package.json:

{
  "name": "vue-CLI",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "build": "webpack",
    "dev": "webpack-dev-server"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.12.3",
    "babel-loader": "^8.1.0",
    "css-loader": "^5.0.0",
    "file-loader": "^6.1.1",
    "node-sass": "^4.14.1",
    "sass-loader": "^10.0.4",
    "style-loader": "^2.0.0",
    "url-loader": "^4.1.1",
    "vue": "^2.6.12",
    "vue-loader": "^15.9.3",
    "vue-style-loader": "^4.1.2",
    "vue-template-compiler": "^2.6.12",
    "webpack": "^5.2.0",
    "webpack-cli": "^4.1.0"
  },
  "devDependencies": {
    "autoprefixer": "^8.0.0",
    "clean-webpack-plugin": "^3.0.0",
    "html-webpack-plugin": "^4.5.0",
    "postcss-loader": "^4.0.4",
    "webpack-dev-server": "^2.11.5"
  }
}

 

还有区分环境打包,分成两个文件(webpack.prod.js、webpack.dev.js),然后提取公共代码(webpack.common.js,使用wepack-merge插件)等,就先不处理了,以上就搭建完啦~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值