美文网首页
webpack4.0手动配置vue+ts

webpack4.0手动配置vue+ts

作者: 浅浅婷 | 来源:发表于2020-02-14 18:39 被阅读0次

    撸起袖子直接干就完事了

    第一版:

    项目结构

    首先安装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

    相关文章

      网友评论

          本文标题:webpack4.0手动配置vue+ts

          本文链接:https://www.haomeiwen.com/subject/seaaxhtx.html