webpack4.0手动配置vue+ts

撸起袖子直接干就完事了

第一版:

项目结构

首先安装node环境,不概述了。

然后安装一下webpack的依赖:npm i webpack webpack webpack-cli -D

然后配置webpack.config.js。由于开发环境和生产环境的配置有公用的部分。所以把公共部分提取出来。

webpack.base.conf.js:

首先:npm i html-webpack-plugin -D(这个plugin的作用是以当前目前的index.html为模板,生成新的html,引入js和css)

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: {
    path: path.resolve(__dirname, '../src/main.js')
  },
  output: {
    path: path.resolve(__dirname, '../dist'),
    filename: '[name].[hash].js',
    publicPath: '/'
  },
  module: {
    rules: []
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'index.html')
    })
  ],
}

webpack.dev.conf.js: 开发环境

npm i webpack-dev-server webpack-merge -D(合并webpack配置)

const merge = require('webpack-merge');
const path = require('path');
const baseConfig = require('./webpack.base.conf.js')

module.exports = merge(baseConfig, {
  mode: 'development',
  devtool: 'inline-source-map',
  devServer: {
    contentBase: path.resolve(__dirname, '../dist')
  }
}) 

webpack.prod.conf.js

npm i clean-webpack-plugin -D(此pulgin的作用是清楚文件,打包后dist文件夹的文件,在此打包后先删除)

const merge = require('webpack-merge');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const path = require('path');
const baseConfig = require('./webpack.base.conf');

module.exports = merge(baseConfig, {
  mode: 'production',
  devtool: 'source-map',
  module: {
    rules: []
  },
  plugins: [
    new CleanWebpackPlugin(['dist/'], {
      root: path.resolve(__dirname, '../')
    })
  ]
})

引入vue:npm i vue

html文件:

<body>
  <div id="app">{{message}}</div>
  <script src="/dist/main.js"></script>
</body>

main.js文件:

import Vue from 'vue'

var app = new Vue({
  el: '#app',
  data: {
    message: 'hello webpack!!!'
  }
})

然后在webpack.base.conf.js里面添加配置别名等

  resolve: {
    alias: {
      // 配置别名'vue$'
      'vue$': 'vue/dist/vue.esm.js',
      // 这个为src配置别名
      '@': path.resolve(__dirname, '../src')
    },
    // 省略拓展名
    extensions: ['*', '.js', '.json', '.vue'],
  }

package.json

"scripts": {
    "dev": "webpack-dev-server --inline --hot --config build/webpack.dev.conf.js",
    "build": "node build/build.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

最后npm run dev ,项目跑起来了


image.png

第二版:

src新增App.vue文件
npm install -D vue-loader vue-template-compiler

新增配置

  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
  }

新增plugin:

const VueLoaderPlugin = require('vue-loader/lib/plugin')
plugins: [
    new VueLoaderPlugin()
  ],

处理样式

npm i less-loader css-loader style-loader less autoprefixer postcss-loader -D
配置:

 {
        test: /\.css$/,
        use: [
          {loader: 'style-loader'},
          {loader: 'css-loader'},
          {loader: 'postcss-loader'}
        ]
      },

配置postcss
新建:postcss.config.js

module.exports = {
  plugins: [
    require('autoprefixer')({
      "overrideBrowserslist": [
        "defaults",
        "not ie < 9",
        "last 2 versions",
        "> 1%",
        "iOS 7",
        "last 3 iOS versions"
      ]
    })
  ]
}

配置less
修改配置

 {
        test: /\.l?(c|e)ss$/,
        use: [
          {loader: 'style-loader'},
          {loader: 'css-loader'},
          { loader: 'less-loader' },
          {loader: 'postcss-loader'}
        ]
  }

处理图片

npm i url-loader file-loader -D
配置:

 {
        test: /\.(png|jpg|jfif|jpeg|gif)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // 低于这个limit就直接转成base64插入到style里,不然以name的方式命名存放
              limit: 8192,
              name: 'static/images/[hash:8].[name].[ext]',
              outputPath: "images/",
              esModule: false // 关闭,否则图片路径解析不正确
            }
          }
        ]
      },

最后npm run dev,大功告成

第三版

配置ts

npm i vue-class-component vue-property-decorator --save
yarn add ts-loader typescript
修改入口:

path: path.resolve(__dirname, '../src/main.ts')

修改extensions:

resolve: {
    extensions: ['.js', '.vue', '.json', '.ts']
  }

添加webpack对ts的解析

{
        test: /\.ts$/,
        loader: 'ts-loader',
        exclude: /node_modules/,
        options: {
          appendTsSuffixTo: [/\.vue$/],
        }
      }

添加 tsconfig.json

{
  // 编译选项
  "compilerOptions": {
    // 输出目录
    "outDir": "./output",
    // 是否包含可以用于 debug 的 sourceMap
    "sourceMap": true,
    // 以严格模式解析
    "strict": true,
    // 采用的模块系统
    "module": "esnext",
    // 如何处理模块
    "moduleResolution": "node",
    // 编译输出目标 ES 版本
    "target": "es5",
    // 允许从没有设置默认导出的模块中默认导入
    "allowSyntheticDefaultImports": true,
    // 将每个文件作为单独的模块
    "isolatedModules": false,
    // 启用装饰器
    "experimentalDecorators": true,
    // 启用设计类型元数据(用于反射)
    "emitDecoratorMetadata": true,
    // 在表达式和声明上有隐含的any类型时报错
    "noImplicitAny": false,
    // 不是函数的所有返回路径都有返回值时报错。
    "noImplicitReturns": true,
    // 从 tslib 导入外部帮助库: 比如__extends,__rest等
    "importHelpers": true,
    // 编译过程中打印文件名
    "listFiles": true,
    // 移除注释
    "removeComments": true,
    "suppressImplicitAnyIndexErrors": true,
    // 允许编译javascript文件
    "allowJs": true,
    // 解析非相对模块名的基准目录
    "baseUrl": "./",
    // 指定特殊模块的路径
    "paths": {
      "jquery": [
        "node_modules/jquery/dist/jquery"
      ]
    },
    // 编译过程中需要引入的库文件的列表
    "lib": [
      "dom",
      "es2015",
      "es2015.promise"
    ]
  }
}

配置.ts识别vue
由于 TypeScript 默认并不支持 *.vue 后缀的文件,所以在 vue 项目中引入的时候需要创建一个 shims-vue.d.ts

declare module '*.vue' {
  import Vue from 'vue';
  export default Vue;
}

接下来就可以用ts语法来写啦

<template>
  <div class="container">
    <p>{{message}}</p>
    <div class="pics">
      <div class="img">
        <img src="../static/images/1.gif"
             alt="">
      </div>
      <div class="imgs">
      </div>
    </div>
    <Hello></Hello>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import Hello from "@/components/hello";

@Component({
  components: {
   Hello
  }
})
export default class App extends Vue {
  message = "hello Vue!!!";

  mounted() {
    this.update();
  }

  update() {
    setTimeout(() => {
      console.log("test");
    }, 1e3);
  }
}
</script>
<style lang="less">
.container {
  background: pink;
  .imgs {
    width: 100px;
    height: 100px;
    background: url("../static/images/1.gif");
  }
}
</style>

大功告成~

参考:
https://segmentfault.com/a/1190000016972438#item-2-1
https://segmentfault.com/a/1190000011744210?utm_source=tag-newest

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