webpack创建项目vue3-ts-webpack

 

一、项目初始化

初始化webpack框架可以直接通过命令行工具wepack init(注意配置node和npm的环境变量)进行创建,这里主要是说明相关配置的关系和作用

既然是初始化,我们首先解决的是能够打包出前端产物,html和css暂时不进行处理,直接对js相关的编译打包进行处理

这里处理的问题

  • 配置webpack的入口和出口
  • js打包的babel基础配置
  • 如何将js导入到html中
  • 本地开发环境的配置

1、初始化package.json

npm init -y

2、安装webpack

npm i webpack webpack-cli babel-loader @babel/preset-env @babel/core -D

3、新建并配置webpack.config.js

首先要配置出口和入口,这样我们就可以直接用webpack进行基础的打包操作,

后面再一步一步去丰富功能,我们一起往下看

我们先实现两个内容,就是js的编译打包,并且引入到html中,直接通过浏览器访问

基础配置

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
/**
 * entry 入口文件路径,还有更多配置方法,后面介绍
 * output 打包产物保存路径 打包的文件名称 bundle.js
 * plugin 帮助webpack完成loader工具 功能丰富 先配置html模板可以引入打包的js文件
*/
module.exports = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js'
  },
  plugins: [
    new HtmlWebpackPlugin({
      // 指定模板文件路径 从入口打包生成的js文件会直接通过script标签引入的html
      template: './public/index.html'
    })
  ]
};

4、根据配置创建入口文件

创建src和public目录

分别创建src/index.js和public/index.html文件

如果是类库可以不配置public/index.html文件,不过也可以另外配置作为前台展示和调试用

index.js

window.onload = () => {
    document.getElementById('app').innerText = 'Hello World'
}

index.html

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

5、配置package.json的script命令和本地开发环境

build命令,直接执行webpack进行打包,mode为production生产模式,会对应使用相应的webpack默认配置,也可以直接在webpack.config.js配置mode字段的值来实现

而本地开发环境dev/serve命令配置需要配合webpack-dev-server使用,所以先安装

npm i webpack-dev-server -D

在package.json中配置scripts的build打包和dev本地开发命令 

{
    "scripts": {
        "build": "webpack --mode=production",
        "dev": "webpack server"
    },
}

其中webpack server为webpack内置的命令,可以直接通过webpack-dev-server启动本地服务器,同时需要在webpack.config.js中增加配置

module.exports = {
+     devServer: {
+         open: true,
+         host: 'localhost',
+     },
}

 

6、新建并配置babel.config.js

Babel 是一个 JavaScript 编译器,babel.config.js 文件用于 Babel 相关的preset、plugin配置,后面我们跟着内容介绍,

这里做的是@babel/preset-env的环境配置,它允许你根据目标环境(浏览器类型版本、node版本等)的特性自动到目标Javasvript版本


{
  "presets" : [
    ["@babel/preset-env",{
      "targets": {
        "browsers": [
          "last 2 versions",
          "not ie <= 9"
        ]
      }
    }]
  ]
}

// or 基础配置
{
  "presets" : [
    "@babel/preset-env"
  ]
}

完成上面的工作内容,执行npm run build就可以获得打包产物,在浏览器中打开生成的html文件就可以获得看到页面展示 Hello World!

 

在实际的应用中,还缺少很多内容,

  • 如何创建css/less/sass文件并引用到项目中生效
  • 如何配置使用typescript
  • 如何使用vue/react框架
  • 如何进行优化配置
  • 等等...

后面我们一一处理

二、框架工具等基础配置

  • 首先解决单样式文件***.css/less的使用问题问题;
  • 在大型项目中为了获得良好的代码api提醒和类型约束的体验,添加上typescript;
  • 最后处理一下接入流行的前端框架进行实际项目开发的问题

1、声明less文件并配置loader

webpack对于文件的处理,

大多会依赖loader对对应的文件类型的内容进行编译转码处理,less也不例外,对应的是less-loader

除了编译以外,还需要将编译的内容导出到指定文件并引入到html中,对应的是mini-css-extract-plugin,

另外针对css的can i use问题,postcss可以对css的样式进行适配不同浏览器添加前缀的处理,另外还可以进行模块化等处理,

MiniCssExtractPlugin | webpack 中文文档将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载。(需要配合css-loader和webpack5⬆使用)

// mini-css-extract-plugin 帮助我们提取样式文件,并导入到html文件中
npm i less-loader mini-css-extract-plugin css-loader -D

 同时也可以支持css文件的处理,另外引入PostCSS 中文文档 | PostCSS中文网,postcss是一个用 JavaScript 工具和插件转换 CSS 代码的工具,通过配置API、插件的形式处理css样式文件,

postcss插件

eg:增加autoprefixer插件配置,自动填充css样式在不同浏览器的前缀适配

npm i postcss postcss-loader autoprefixer -D

新建postcss.config.js文件

module.exports = {
  plugins: [["autoprefixer"]],
};

增加webpack.config.js配置

+ const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
+   module: {
+     rules: [
+       {
+         test: /\.less$/,
+         use: [MiniCssExtractPlugin.loader, 'postcss-loader', 'css-loader', 'less-loader']
+       },
+       {
+         test: /\.css$/,
+         use: [MiniCssExtractPlugin.loader, 'postcss-loader', 'css-loader']
+       }
+     ]
+   },
  plugins: [
+     new MiniCssExtractPlugin({
+       filename:'style.css' // 指定输出的 CSS 文件名
+     })
  ]
};

2、增加typescript配置

由于JavaScript的弱类型特性,在大型项目中,针对不同的api的开发和使用,容易出现不确定性的问题,并且在调用的时候如果没有api接口的提示,在不熟悉的情况下影响开发效率,增加维护成本,

强类型和类型约束的TypeScript针对性的解决了这些问题,在大型项目中使用TypeScript也是非常合适的

其使用依赖于 typescript 和 ts-loader,,同时需要声明tsconfig.json文件

TypeScript 中文手册 - TypeScript 中文手册Typepscript作为JavaScript的超集,通过类型约束

npm i typescript ts-loader -D

创建tsconfig.json文件进行ts相关配置

{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "moduleResolution": "node",
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "paths": {
      "@/*": [
        "src/*"
      ]
    },
    "lib": [
      "esnext",
      "dom",
      "dom.iterable",
      "scripthost"
    ]
  },
  "include": [
    "src/*.ts",
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

3、引入并使用vue

针对vue的处理,

首先要通过 vue-loader处理.vue文件

另外需要处理.vue的单文件需要使用@vue/compiler-sfc

由于前面配置了TypeScript,所以在使用需要引入@types/vue,编译工作依赖@vue/runtime-core,@vue/runtime-dom

 

npm i vue-loader @vue/compiler-sfc @vue/runtime-core @vue/runtime-dom @types/vue -D
npm i vue

在wepack.config.js中增加loader配置,注意在resolve.extension数组中增加 '.vue'方便引入,

+ const { VueLoaderPlugin } = require('vue-loader');
module.exports = {
+   module: {
+     rules: [
+       {
+         test: /\.vue$/,
+         use: 'vue-loader'
+       }
+     ]
+   },
  plugins: [
+     new VueLoaderPlugin()
  ]
};

开始声明vue应用的入口和代码文件

src/index.ts注册app

import { createApp } from 'vue'
import App from "./index.vue"  //如果没有配置@可以配置一下 或者换成绝对路径
const app = createApp(App)
app.mount('#app')

src/index.vue

<template>
    <div>
        这是一个vue应用开发者是<span>{{ name }}</span>
    </div>
</template>
<script lang="ts" setup>
const name = '张ceshi三'
</script>
<style lang="less">
span {
    color: red;
}
</style>

三、验证以及后续计划

1、开发环境

项目目录根路径执行

npm run dev

打开会发现出现引用index.vue类型声明的报错,我们需要在src目录下新建shmi.d.vue文件,文件的主要作用是声明 Vue 文件的模块类型,使得 TypeScript 能够正确地处理 .vue 文件,并且不再报错。

declare module '*.vue' {
  import { DefineComponent } from 'vue'
  const component: DefineComponent<{}, {}, any>
  export default component
}

之后就可以在打开的浏览器中看到效果

8616e36bc28f4dc19acc9d13557b313a.png

2、打包产物

接下来我们看一下打包产物是否符合预期,执行

npm run build

 打包成功产物

7c71971c8504471b899a4ada07a958b9.png

直接在浏览器中打开index.html

83f5692df83d4ba08145bf0d973ab9a3.png

3、后续优化

在实际开发中的环境配置,应用配置等

分包优化等操作

gzip,内联图片等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值