使用Vue Loader 结合webpack自己创建vue脚手架 解决template报错render函数

简介: 使用Vue Loader 结合webpack自己创建vue脚手架 解决template报错render函数

1.概括


Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件

疑问???

我们为什么可以直接这样书写组件文件(看下图)

在这里插入图片描述
简而言之,webpack 和 Vue Loader 的结合为你提供了一个现代、灵活且极其强大的前端工作流,来帮助撰写 Vue.js 应用。

Vue Loader 还提供了很多酷炫的特性:

在这里插入图片描述

起步:如果你觉得vue cli脚手架创建的项目不满足你的需求你可以从零开始创建你自己的 webpack 配置

**如果你不想手动设置 webpack,我们推荐使用 Vue CLI 直接创建一个项目的脚手架。通过 Vue CLI 创建的项目会针对多数常见的开发需求进行预先配置,做到开箱即用。
如果 Vue CLI 提供的内建没有满足你的需求,或者你乐于从零开始创建你自己的 webpack 配置,那么请继续阅读这篇指南。**

安装相对应的版本号
在这里插入图片描述

新建目录结构:

    |- index.html   // 单页面入口 
     |- src          // 存放源文件目录 
         |- main.js     // 打包入口文件
         |- App.vue     // 根组件,替换index.html中的 #app 处 
         |- router.js   // 路由 
         |- components  // 存放组件目录 
     |- webpack.config.js // webpack 配置 
     |- package.json // `npm init -y` 初始化项目 
     |- node_modules // 依赖目录

新建 目录结构
在这里插入图片描述
1.安装npm (记得匹配对应的版本号否则报错)

npm install -D vue-loader@15.7.0
npm install -D vue-template-compiler@2.6.10
npm  i vue@2.6.10

2.配置webpack.config.js 官方的配置代码示例(只是看一下官方的配置 最终按照自己的项目配置示例来)
在这里插入图片描述
自己的项目配置示例 (在之前教程原有的基础上添加了上面的几个参数)

 1 const { VueLoaderPlugin } = require('vue-loader')
 2 new VueLoaderPlugin() // 请确保引入这个插件!
 3 {//处理.vue单文件文件
      test: /\.vue$/,
      loader: 'vue-loader'
    }

完整版本

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 引入vue-loader插件
const { VueLoaderPlugin } = require('vue-loader')

module.exports = {
    mode: 'development',//production development开发环境不压缩dist 
    entry: './src/main.js',
    devServer: {
        // static: './dist',
        contentBase: './dist',
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: './index.html'
        }),
        // 请确保引入这个插件!
        new VueLoaderPlugin()
    ],

    output: {
        path: path.join(__dirname, './dist/'),
        filename: 'bundle.js'
    },

    module: { // 模块      
        rules: [ // 规则   
            {
                test: /\.css$/, // 正则表达式,匹配 .css 文件资源        
                use: [  // 使用的 Loader ,注意顺序不能错           
                    'style-loader',//js识别css
                    'css-loader'//将css转换为js
                ]
            },
            {
                test: /\.(png|svg|jpg|gif)$/,
                use: [
                    'file-loader'
                ]
            },
            {
                test: /\.m?js$/,
                exclude: /(node_modules)/,//排除的目录
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']//babel中内容的转换规则工具
                    }
                }
            },
            {//处理.vue单文件文件
                test: /\.vue$/,
                loader: 'vue-loader'
            }
        ]
    }
}

3.在index.html创建el的指向 app
在这里插入图片描述
4.App.vue书写组件
在这里插入图片描述
5.在main.js主入口引入App组件
在这里插入图片描述

运行命令打包webpack npm run build

npm  run build

运行命令打开浏览器 npm run dev

npm  run  dev

很遗憾 报错了 因为我们引入的不是Vue的完整版本:.cn/7b75ebc782bb4571a39f0c64f16fa800.png)

如果你不想知道报错的原因,可以快速地使用这段代码进行实现功能

在这里插入图片描述

解决:上面的报错

在node_modules目录,找到刚刚安装的vue目录,打开目录下的package.json文件,找到main属性
在这里插入图片描述
import Vue from 'vue' 导入的vue文件默认是node_modules目录下的vue文件下的package.json 中的 main 属性指定的文件,可以发现它并不是我们熟悉的 vue.js 完整版文件,import 的是运行时版本,不是完整版,

- 完整版:同时包含编译器和运行时的版本。
- 编译器:用来将 template 的模板字符串编译成为 JavaScript 渲染函数的代码。
- 运行时:用来创建 Vue 实例、渲染并处理虚拟 DOM 等的代码。没有编译器功能,无法编译模板

也就是说,template 渲染的字符串,运行时版本 vue 无法解析没有编译器功能 无法编译template模板(编译不了模板就运行不了组件)
在这里插入图片描述

**解决2种方法:
第1种方法:import 导入完整版 vue**
引入的是node_modules下的vue的dist的文件
在这里插入图片描述

import Vue from 'vue/dist/vue.js'//import 导入node_modules下的vue文件完整版 vue
  new Vue({    
    el: '#app',   
    template: '<App />',
      components: {App}
      })    

**第2种方法:

1. 依旧 import Vue from ‘vue’**
 
 import Vue from 'vue'
import App from './App.vue'
new Vue({
    el: '#app',
    template: '<App/>',
    components: { App }
})

2. 然后 webpack.config.js 增加一个属性 (该方法换汤不换药)

module.exports={
 resolve: {
        alias:
            { 'vue$': 'vue/dist/vue.js' }
    }
}

运行命令 npm run build

npm  run build

浏览器最终渲染出App.vue的组件内容
在这里插入图片描述

总结:

1. 以上两种方法都可以解决。但是完整版比运行时 vue 大,性能不如运行时 vue。
2. 官方更推荐运行时 vue,因为 vue-loader 可以编译 .vue 文件,所以事实上是不需要 vue 的编译功能的,只需要渲染功能即可。
3. 而 template 自身没有渲染功能,最终渲染底层都是通过 render 函数够实现的。如果写了 template 属性,则最终还会需要编译成 render 函数,这个编译过程对性能会有一定损耗
4. 所以使用运行时 vue 通过 render 函数来渲染组件即可。

最优解决方法

Vue 实例中,不使用 template ,而是直接使用 render 函数来渲染组件即可 。
注意:上面方法2在 webpack.config.js 添加的配置记得取消掉

**

重点:

**

 **通过render把App组件进行渲染到el执向的index.html的app标签
 App.vue使用的是路由占位符 <router-view/> 把所有的组件渲染到占位符 再把使用占位符的App.vue文件渲染到index.html文件进行运行就实现了最终的效果**

在这里插入图片描述

相关文章
|
1月前
|
前端开发
在Webpack配置文件中,如何配置loader以处理其他类型的文件,如CSS或图片
在Webpack配置文件中,通过设置`module.rules`来配置loader处理不同类型的文件。例如,使用`css-loader`和`style-loader`处理CSS文件,使用`file-loader`或`url-loader`处理图片等资源文件。配置示例:在`rules`数组中添加对应规则,指定`test`匹配文件类型,`use`指定使用的loader。
|
1月前
|
前端开发 JavaScript
webpack 中 loader 和 plugin 的区别
在 webpack 中,loader 用于转换模块的源代码,如将 TypeScript 转为 JavaScript;而 plugin 则扩展了 webpack 的功能,可以执行更复杂的任务,如优化打包文件、注入环境变量等。两者共同作用于构建流程的不同阶段。
|
1月前
|
JavaScript 前端开发
Webpack中loader的使用场景
Webpack中的Loader用于处理和转换模块文件,如将TypeScript转为JavaScript、CSS预处理等,通过配置不同的Loader,可以灵活地支持多种文件类型和语言,实现模块化开发与构建优化。
|
1月前
|
存储 JavaScript 前端开发
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
【10月更文挑战第21天】 vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
vue3的脚手架模板你真的了解吗?里面有很多值得我们学习的地方!
|
1月前
|
前端开发 JavaScript
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
|
1月前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
2月前
|
JavaScript API
vue3知识点:ref函数
vue3知识点:ref函数
41 2
|
2月前
|
JavaScript API
vue3知识点:自定义hook函数
vue3知识点:自定义hook函数
32 2
|
2月前
|
API
vue3知识点:reactive函数
vue3知识点:reactive函数
37 1
|
2月前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
82 3

热门文章

最新文章