Vue-模块化 2

简介: Vue-模块化

4、webpack中loader的使用

前面介绍了webpack,使用webpack主要是模块化开发我们的代码并且webpack还会自动处理模块之间的依赖。但是前端项目中还需要其他文件,例如css、图片,也包括将一些高级的ES6语法转化成ES5语法、vue文件转换成js文件等,对webpack本身来讲这些转化他本身是不支持的此时就需要给webpack安装扩展功能loader。  

4.1 css-loader和style-loader的使用

不同的loader负责处理不同的格式,需要某个loader时要使用npm将loader下载下来,然后在webpack.config.js文件中的modules关键字下进行配置。

假设项目中存在css文件:

我们知道要想使该css文件生效的话需要在index.html文件中中引用该css文件,但是需要注意的是大型项目中的css样式有上百个难道需要我们一个一个引用吗?当然不是我们需要将css文件模块化引入到打包文件 bundle.js文件中。但是在当前项目中入口文件main.js中没有引入css文件,所以使用指令npm run build 并不能将css文件打包到bundle.js文件中。只要将css模块引入到main.js文件中就能将css样式引用:

然后就要将main.js文件打包,那么webpack既然处理不了css文件,那处理css文件的loader是哪个呢?给出官网地址,可以在中文官网找到答案:

loaders | webpack 中文网 (webpackjs.com)

带你进去之后会有详情的下载步骤,这里要注意的是,在本项目中我的webpack版本是5.0.0。因为安装3.6.0的版本css loader 和style loader 安装不上。

4.2 less-loader的使用

less文件要想被项目加载就需要引入到项目的入口文件main.js中。本质上lessloader的作用是将less文件转换成css文件

1. /*引入less文件*/
2. require('./css/special.less')

使用指令npm install --save-dev less-loader less 加载lessloader,然后在webpack.config.js文件中添加相关配置, 再进到项目中执行打包指令:   npm run build,即可。

4.3 url-loader、file-loader

在css文件中使用图片时也需要下载图片的loader,也就是url-loader@1.1.2,下载完后还需要在配置文件中添加相关配置:

module: {
    rules: [
      {
        test: /\.(png|jpg|gif)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              /*当图片的大小小于limit(KB)时会使用url-loader将图片编译成base64的字符串形式*/
                            limit: 70000
                            /*当图片的大小大于limit时,会使用file-loader对图片进行加载。使用file-loader
                            * 不需要进行配置只需下载file-loader即可*/
            }
          }
        ]
      }
    ]
  }

然后需要进行重新打包:npm run build

运行index.html文件:

当图片的大小大于limitKB时需要加载file-loader@3.0.1,然后将文件重新打包。

4.4 babel-loader

转成ES5的原因是现在很多的浏览器不支持ES6的语法(chrom支持),为了让更多浏览器兼容项目,需要使用babel-loader,首先需要在配置文件中添加配置:

 {
                test: /\.js$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['es2015']
                    }
                }
            }

然后在终端使用指令:npm install --save-dev babel-loader@7  babel-core babel-preset-es2015


然后重新打包运行,观察dist文件夹下面的bundle.js文件发现变成ES5的语法格式。

5、webpack中配置Vue

如果在项目中想使用vue的话需要添加vue的依赖,之前使用<scprit>标签引用的vue不是模块化管理的vue。在引入模块化思想之后需要使用npm安装:npm install vue@2.5.21 --save   因为整个项目都是使用vue所以不需要加--dev 然后在配置文件中添加resove属性:

 resolve:{
        alias:{
            "vue$":'vue/dist/vue.esm.js'
        }
    }

完成上述的配置之后就能使用了:

6、el和template的区别

在实际的开发中index.html文件是不会修改的也就是说index.html文件只是负责引入bundle.js文件和编写vue实例挂载的对象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
vue挂载的对象
-->
<div id="app">
</div>
<!--
引入bundle.js文件
-->
<script src="./dist/bundle.js"></script>
</body>
</html>

如果相使用vue实例内部的数据的话该怎么写呢?需要写在vue的template和属性中。最后编译的时候会将index.html文件中的<div></div>替换成template中的内容:

/*引入vue*/
import Vue from 'vue'
const app = new Vue({
    el:"#app",
    template:`
      <div>
        <p>{{message}}</p>
      </div>
    `,
    data:{
        message:"哈哈"
    }
})

重新打包运行:

查看编译后的代码:

发现之前的<div id='app'></div>被替换了~

结论:vue实例中的template会在编译的时候替换el

但是假设vue实例中的template代码很多呢?写在template中就不合适了,就需要抽取。

也就是将模板抽取成模板对象,在vue实例中注册模板对象。代码如下:

/*组件*/
const APP = {
    template:`
      <div>
        <p>{{message}}</p>
      </div>
    `,
    data(){
       return{
           message: "KJHJADGFLASGKJHFLASJKDFHASKJDLFHLJKSADF"
       }
    }
}
/*引入vue*/
import Vue from 'vue'
const app = new Vue({
    el:"#app",
    template:'<APP/>',
    /*注册组件*/
    components:{
        APP
    }
})

进一步抽取,我们将组件抽取到转门写vue的文件夹vue中文件的名字叫app.js。

重新将项目打包运行即可。

但是在app.js中模板代码和js代码仍然 没有分离因此需要对模板再进行抽取。所以现在需要在vue文件夹下创建文件App.vue。但是在创建App.vue文件时需要加载loader文件:npm install vue-loader@13.0.0 vue-template-compiler@2.5.21 --save-dev

还要在配置文件中的module中添加相关配置如下:

在main.js文件中导入App.vue文件并打包运行即可。

注意:

相关文章
|
5天前
|
JavaScript
vue消息订阅与发布
vue消息订阅与发布
|
2天前
|
JavaScript
理解 Vue 的 setup 应用程序钩子
【10月更文挑战第3天】`setup` 函数是 Vue 3 中的新组件选项,在组件创建前调用,作为初始化逻辑的入口。它接收 `props` 和 `context` 两个参数,内部定义的变量和函数需通过 `return` 暴露给模板。`props` 包含父组件传入的属性,`context` 包含组件上下文信息。`setup` 可替代 `beforeCreate` 和 `created` 钩子,并提供类似 `data`、`computed` 和 `methods` 的功能,支持逻辑复用和 TypeScript 类型定义。
20 11
|
6天前
|
JavaScript 前端开发 IDE
Vue学习笔记5:用Vue的事件监听 实现数据更新的实时视图显示
Vue学习笔记5:用Vue的事件监听 实现数据更新的实时视图显示
|
6天前
|
JavaScript 前端开发 API
Vue学习笔记4:用reactive() 实现数据更新的实时视图显示
Vue学习笔记4:用reactive() 实现数据更新的实时视图显示
|
5天前
|
JavaScript
vue尚品汇商城项目-day07【vue插件-50.(了解)表单校验插件】
vue尚品汇商城项目-day07【vue插件-50.(了解)表单校验插件】
14 4
|
5天前
|
JavaScript
vue尚品汇商城项目-day07【51.路由懒加载】
vue尚品汇商城项目-day07【51.路由懒加载】
15 4
|
6天前
|
JavaScript 前端开发
Vue学习笔记8:解决Vue学习笔记7中用v-for指令渲染列表遇到两个问题
Vue学习笔记8:解决Vue学习笔记7中用v-for指令渲染列表遇到两个问题
|
5天前
|
JavaScript
vue尚品汇商城项目-day07【vue插件-54.(了解)生成二维码插件】
vue尚品汇商城项目-day07【vue插件-54.(了解)生成二维码插件】
14 2
|
6天前
|
JavaScript 前端开发 API
Vue学习笔记7:使用v-for指令渲染列表
Vue学习笔记7:使用v-for指令渲染列表
|
6天前
|
JavaScript
vue 函数化组件
vue 函数化组件
下一篇
无影云桌面