【Webpack,Vite】开发中遇到常见问题集合

2023-11-03

1、sass :export

:export 是用于sass文件和js文件关联的,用此可以将sass中样式类似于es6语法中export导出,并在其他样式或者js文件中直接使用,但是 目前只适用于 webpack4 或者 node-sass v4.9及以上

 demo:

@/styles/common.scss

$primary:#ffffff;
$sideWidth: 100px;

:export {
  primary: $primary;
  sideWidth: $sideWidth;
}

 应用组件

<script>
    import common from  '@/styles/common.scss'
    export default{
        mounted() {
           console.log(common.sideWidth)
        }
    }
</script>
<style>
import '@/styles/common.scss';
.main{
   color: primary;
}
</style>

2、vue.config.js loaderOptions 的 prependData 和 additionalData

主要是用来配置全局变量的,用法大致都一样,只是对应sass-loader版本不同, v8以下用的是data,v8用的是prependData, v10及以上用的是additionalData目前一般安装最新的都是additionalData, 另外 在sass编译条件下@import不用加分号,scss编译条件下需要分号,注:scss语法也会在sass-loader下编译

demo:

module.exports = {
  css: {
    loaderOptions: {
      sass: {
        additionalData: `@import "~@/assets/styles/common.sass"` // sass不需要加分号
      },
      scss: {
        additionalData: `@import "~@/assets/styles/common.scss";` // scss必须要加分号
      }
    }
  }
};

3、node-sass 安装失败

这种错误相信使用大家在改以前旧项目时经常遇到,很恼火,一般导致这问题的原因如下

1、没有配置npm镜像源,从国外访问太慢导致失败

解决方法:

npm config set registry https://registry.npm.taobao.org
set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ && npm install node-sass

2、 node 版本 和 node-sass 不兼容

以前很多老项目开始的时候,可能node版本才v10,一般的都v14,现在node 16都出来了,要是你们项目里package.json没有锁定依赖具体版本,那么就会全下载最新的,那肯定兼容报错

以下在我在node-sass github收集的 ,想去看的链接如下

https://github.com/sass/node-sass/releases

Node版本 node-sass版本
12, 14, 16, 17 7.0.1
12, 14, 16, 17 7.0.0
12, 14, 15, 16 6.0.1
12, 14, 15, 16 6.0.0
10, 12, 14, 15 5.0.0
0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 4.14.1
0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 4.14.0
0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 4.13.1
... ...

3、提示python啥的,然后安装失败

遇到这种问题,先别急,大概率就是node 版本 和 node-sass 不兼容,这时候先 uninstall node-sass,再将你的node_modules 移除掉,一般来说有错误日式也要一并删除掉,然后先对照我第二点,找到你对应的node-sass版本下载

总结一下:其实node-sass是导致vue项目安装出错最多的依赖,官方都不推荐了额,你在新建项目时,能选择dart-sass就选择dart-sass吧

4、sass-loader 安装报错

这依赖又跟上面node-sass版本紧密相关了,看吧 node-sass问题太多了,不过用了也没办法,总得解决一下,下面是部分 node-sass 与 sass-loader 关联版本

node-sass sass-loader
4.3.0 4.1.1
4.7.2 7.0.3 7.3.1
4.14.1 7.3.1
5.0.0 7.2.0
6.0.1 10.0.1

---持续更新---

5、command failed: pnpm install --reporter silent --shamefully-hoist 

出现此原因是在你vue create xxx 创建项目时时,默认使用pnpm,然后需要版本为6

npm i pnpm@6 -g

然后再

vue create xxx

6、目前打包器依赖及打包格式

sass(已升级到1.57.1)vite直接安装sass,webpack安装sass和dart-sass/node-sass;
vite(内置rollup,已升级到4);

rollup(升级到3)(官网:https://rollupjs.org/migration/);

/es(esmodule rollup使用)现代浏览器常用
/umd(通用模块化,包含amd,cjs 和 iife)现代浏览器常用
/cjs(CommonJS,同步,主要用于服务器端开发)(webpack使用)
/amd(RequireJS,异步,浏览器端开发)
/cmd(SeaJS,异步,浏览器端开发)

7、技术热点

vite4(官方文档还未出来) => rollup3
vite3 (需要 Node版本 14.18+, 16+.,yarn和npm的确不行,必须要指定node版本之上,但是pnpm可以不需要指定node版本,直接安装到最新的vite)=> rollup2

vite2(需要 Node版本 12.2.0 +)=> rollup2
Webpack 5 => Node.js v10.13.0+

8、vue2 + vite3解决方案

pnpm add vite@3.2.3 -D
pnpm add vite-plugin-vue2 -D
pnpm add vue-template-compiler@2.6.11 -D

想用jsx语法的话,需要安装依赖 @vue/babel-preset-jsx 此依赖用于vue2 + jsx
下面是相关链接

vue2 + vite

9、vue-loader各版本

v15.10.1
const VueLoaderPlugin  = require('vue-loader/lib/plugin')
v16及以上
const VueLoaderPlugin  = require('vue-loader/dist/plugin').default

10、webpack中sass-loader css-loader style-loader依赖作用

通过 sass-loader 把 SCSS 源码转换为 CSS 代码,再把 CSS 代码交给 css-loader 去处理。
css-loader 会找出 CSS 代码中的 @import 和 url() 这样的导入语句,告诉 Webpack 依赖这些资源。同时还支持 CSS Modules、压缩 CSS 等功能。处理完后再把结果交给 style-loader 去处理。
style-loader 会把 CSS 代码转换成字符串后,注入到 JavaScript 代码中去,通过 JavaScript 去给 DOM 增加样式。

11、vite 相关知识

Vite 将应用中的模块分为依赖和源码两类,分别进行服务器启动时间的优化。

1、 依赖模块,开发过程中基本不会变化:(强缓存)

Vite 对依赖采用了 esbuild 预构建的方式,全存在强缓存中,除非删除.vite文件或者执行vite dev --force
才会刷新依赖缓存,其次esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍;
解析过程:
import Vue from 'vue' 会转换成 import Vue from '/@modules/vue'
解析/@modules 会到包里面,将dist/vue.runtime.esm-bundler.js返回回来
源码模块,是用户自己开发的代码,会经常变动。(协商缓存)

2、 生产环境的构建为什么不直接使用 esbuild,而是使用 rollup 呢?

因为 esbuild 在代码分隔、css 处理等方面的功能仍在开发中,rollup 在应用打包方面更加的成熟且灵活

3、 依赖预构建的目的

开发阶段,Vite 的 Dev Server 将所有代码视为原生 ES 模块。因此,Vite 必须将 CommonJS 或 UMD 发布的依赖项转为 ESM
Vite 将有很多内部模块的依赖视为单个模块,浏览器只需要发起一个请求。

4、 webpack和vite对比

webpack:
需要将源码打包成Bundle给浏览器,有文件更新会重新打包,项目越大越慢,本身不支持
ts/jsx等
支持的模块规范:ES Modules,CommonJS 和 AMD Modules;
开发环境:通过 webpack-dev-server 托管打包好的模块;
生产环境:webpack
vite:
直接将源码转换成ES Modules文件给浏览器,有文件更新只会编译有更新的文件,
不管项目大小都很快,并且本身就只吃ts/jsx等
支持的模块规范:ES Modules;
开发环境:原生 ES Modules;
生产环境:Rollup

12、vue3 + element-plus cdn引入时,报‘createElementVNode‘ (imported as ‘_createElementVNode‘) was not found 错误

这种问题多数是在main文件中,先挂载了dom,再执行use(ElementPlus),正确顺序如下:

const app = createApp(App)
app.use(ElementPlus).mount('#app')

 当然index.html中cdn的包应该如下:

    <!-- 引入样式 -->
    <link rel="stylesheet" href="//unpkg.com/element-plus/dist/index.css" />
    <!-- 引入组件库 -->
    <script src="//unpkg.com/element-plus"></script>

13、vue3 + vite 运行报错 Cannot read properties of null (reading 'isCE')

这种情况多数源于vue版本不对,导致这个问题的原因就是 我们在vite打包里,一般使用rollup-plugin-external-globals 或者其他插件将vue不打入依赖代码库中,想使用cdn外链形式引入,但是你的package.json中 dependencies 中有vue依赖,导致外链cdn和依赖中都有vue,所以解决方式就是将依赖从生产依赖dependencies去除掉,可以加在开发依赖devDependencies中没问题。

那有童鞋想说:如何根据开发环境和生产环境来配置呢? 其实生产环境我们就需要减少依赖的使用,因为打包后会增加包的体积,所以生产环境基本使用cdn外链形式就可以,开发环境就将依赖写入devDependencies就行

14、Component is missing template or render function

出现这问题,一般就是两种可能

可能1:文件名后缀

ts = js > tsx = vue, 基本上来说就是逻辑文件优先于模板文件,在你省略后缀时将以这种优先级导入文件

可能2:文件内为空

比如你引入了vue文件,但是文件内没有代码,就会报这种错误,最简单解决方式就是加上下面几行,使文件不为空

<template>
    <div></div>
<template>

---持续更新---

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Webpack,Vite】开发中遇到常见问题集合 的相关文章

  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • 将 Regex 对象分配给 html 输入模式

    我需要以编程方式将正则表达式对象分配给输入元素模式属性 以下是我当前的实现 var regex d 5 element attr pattern regex toString slice 1 1 有没有更好的方法来做到这一点而不需要字符串操
  • 在 Node.js 中生成带条形码的 pdf

    我在用https github com devongovett pdfkit https github com devongovett pdfkit生成 PDF 文件 我可以简单地使用类似的方法 app get get pdf req re
  • 在 Vue 3 的生产构建过程中从 Vue 模板中删除所有数据测试属性

    我在 TS 中使用 Vue3 最后一个 vue cli 我想在 vue loader 编译 vue 文件时获取所有节点 vnodes 元素 我需要读取节点属性并删除所有 数据测试 我尝试在 vue config js 中使用 module
  • 获取被调用的 javascript 文件的查询字符串

    是否可以在调用的 javascript 文件上使用 javascript 获取查询参数 如下所示 in html in file js console log this location query 这是否可能以某种方式实现 或者我必须使用
  • Javascript 将对象推送为克隆

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • Javascript 作为对象键的函数与块中标记函数之间的语法冲突

    假设您有一个支持两者的浏览器带标签的函数声明 https developer mozilla org en US docs Web JavaScript Reference Statements label Labeled function
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • 如何在 Vuejs 中加载 Pixi 实例?

    我正在 VueJS 组件中学习 PixiJS 如下所示Pixi教程 https github com kittykatattack learningPixi我控制台显示此错误 vue runtime esm js 2b0e 619 Vue
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • node.js 模块/导出系统:是否可以将模块导出为函数

    我想在 Dispatch js 中做这样的事情 function handle msg exports handle 这在调用index js中 var dispatch require Dispatch dispatch data 有任何
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • 轮播滑动(未滑动)事件上的火灾事件,Bootstrap 3

    Bootstrap 2 似乎可以很好地处理幻灯片事件 请参阅这个问题 https stackoverflow com questions 9651466 how to attach slide slid events to the boot
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len
  • nuxt.js - 如何在服务器端为所有客户端缓存 axios 调用

    我正在使用 vue nuxt js 应用程序 我想知道是否可以为所有客户端缓存 axios webservice 调用 我必须获取一些货币参考数据 而每个客户都必须调用这些数据并没有多大意义 有人可以给我一些提示 甚至是一个例子吗 谢谢 这
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这

随机推荐

  • 将gif图转成静态图片显示canvas

    需求描述 仅一张gif动图 进入页面 呈现静态图片显示 点击 gif图显示 代码实现
  • uniapp全局分享以及指定页面分享禁用的设置

    1 创建share js文件 module exports onLoad 设置默认的转发参数 share title 默认为小程序名称 path 默认为当前页面路径 imageUrl 默认为当前页面的截图 白名单 const urlList
  • Apollo学习笔记

    Apollo学习笔记 Apollo课程 智能驾驶入门课程 无人驾驶概览 1 软件层分为三层 实时操作系统 RTOS 确保在给定时间内完成特定任务 实时时确保系统稳定性 驾驶安全性的重要要求 通过在Ubuntu Linux操作系统加入Apol
  • 带有Cookie功能的HTTP访问函数,GET,PUT/POST

    define AFX INET SERVICE FTP INTERNET SERVICE FTP define AFX INET SERVICE HTTP INTERNET SERVICE HTTP define AFX INET SERV
  • Oracle删除数据的三种方式

    Oracle删除数据的三种方法 删除表 记录和结构 的语句delete truncate drop drop命令 drop table 表名 例如 删除学生表 student drop table student 注意 1 用drop删除表
  • node.js学习——初始node,node基本介绍,环境安装,运行第一个node程序。

    node js学习 初始node node基本介绍 环境安装 运行第一个node程序 1 node基本介绍 为什么学习Node js 什么是node js Node js的特性 Node js能做什么 2 Node环境安装 环境安装 3 第
  • Oracle中connect by...start with...的使用

    一 语法 大致写法 select from some table where 条件1 connect by 条件2 start with 条件3 其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果 wh
  • android studio导入源码(来自github上下载的压缩包)

    Francis学习笔记之android studio解决系列一 andorid studio导入源码问题及android studio 中途出错解决办法 一 导入源码 首先看一下从github下载的压缩包解压后文件内容 从上面发现没有gra
  • 【深度长文】循序渐进解读Oracle AWR性能分析报告

    深度长文 循序渐进解读Oracle AWR性能分析报告 原创 2016 10 19 韩锋 DBAplus社群 http mp weixin qq com s biz MzI4NTA1MDEwNg mid 2650757102 idx 1 s
  • Android onNewIntent调用时机

    1 onNewIntent 首先看一下Activity 的生命周期 从图中可知 初次启动 Activity 时 调用顺序为 onCreate gt onStart gt onResume 那么 onNewIntent 是什么时候被触发的呢
  • 动态解析ipv6地址,实现域名访问家里网络

    前提已有IPv6地址 有阿里云的域名 非顶级域名便宜 一般几块一年 脚本实现方式 获取token 如果没有创建一个 获取阿里云AccessToken 修改脚本变量值 运行后运行脚本 即可在域名解析找到新增的记录 因为供应商提供dns不固定
  • 一文带你熟练掌握android的arm32汇编指令。

    1 ARM32的常见指令解析 ADC 带进位加法指令 ADD 加法指令 AND 逻辑与指令 B 分支指令 BIC 位清零指令 BL 带返回的分支指令 BLX 带返回和状态却换的分支指令 BX 带状态却换的分支指令 CDP 协处理器数据操作指
  • 内联函数inline和宏定义

    内联函数inline和宏定义 内联函数的优越性 一 inline定义的类的内联函数 函数的代码被放入符号表中 在使用时直接进行替换 像宏定义一样展开 没有了调用的开销 效率很高 二 类的内敛函数是一个真正的函数 三 使用内联函数inline
  • 【华为OD机试】 比赛的冠亚季军【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 有N 3 N lt 10000 个运动员 他们的id为0到N 1 他们的实力由一组整数表示 他们之间进行比赛 需要决出冠亚军 比赛的规则是0号和1号比赛 2号和3号比
  • Python网络爬虫--项目实战(2)--起点小说爬取

    一 目标 爬取起点小说一本免费小说 并将所有章节名称和内容都保存到本地 我选择爬取 我真的好想打球 二 分析 2 1 网页分析 ctrl U 进入网页的源代码 输入任意章节名称 可以在代码中找到 初步判定该网页为静态加载的 2 2 反爬分析
  • [整理]Android屏幕适配(不同的屏幕分辨率和尺寸)

    Android屏幕适配 目录 Android屏幕适配 概念区分 换算关系 划分标准 Android手机常见尺寸和对应分辨率 部分Android测试机分析 补充9图的使用说明 在实际开发过程中 会遇到不同的机型 为了让控件和布局要在不同屏幕上
  • oracle-02 基本命令

    step1 eg 这一部分内容会保存到 test sql文件中 step2 step 3 当前用户有哪些表格 SQL gt desc user tables SQL gt select table name from user tables
  • 慢sql监控

    1 开启慢sql日志 1 1 windows window的mysql配置 编辑C ProgramData MySQL MySQL Server 5 7 my ini 添加如下 是否开启慢查询日志 1表示开启 0表示关闭 slow quer
  • MySQL中IF函数的使用方法

    定义 IF函数根据条件的结果为true或false 返回第一个值 或第二个值 语法 IF condition value if true value if false 参数 参数 描述 condition 必须 判断条件 value if
  • 【Webpack,Vite】开发中遇到常见问题集合

    1 sass export export 是用于sass文件和js文件关联的 用此可以将sass中样式类似于es6语法中export导出 并在其他样式或者js文件中直接使用 但是 目前只适用于 webpack4 或者 node sass v