Vue模块化

93 阅读7分钟

一、模块化的原因

前端代码量的增加使得代码通常被放在多个js文件中进行维护,但存在全局变量同名等问题,同时对js文件的引用顺序有要求

解法一:使用匿名函数把变量限制在函数内部

缺点:未解决代码复用性问题

解法二:使用模块作为出口

在函数内部定义一个包含所有要暴露的方法和属性的对象,并将这个对象返回并用一个变量接收,在main.js中直接使用模块属性和方法即可。

常见的模块:CommonJS,ES6中的modules

模块化的核心:输入与导出

二、ES6的模块化

使用<script type= "module">

导入:export {变量名},也可以在导出时声明变量

当某个模块包含某个功能且导入者想自己给功能命名时,可以使用export default进行默认导出,只需使用import + 命名 + from '模块位置'即可导入。一个模块仅能有一个默认导出

导出:import {变量名} from "模块位置"

全部导入 import * as {别名} from "模块位置",再调用通过对象属性和方法的形式使用

三、Webpack

安装webpack

安装webpack首先要安装Node.js,Node.js里面自带了软件包管理工具npm

查看Node版本方式: 在终端输入node -v命令

全局安装webpack:npm install webpack@3.6.0-g

局部安装webpack:cd 对应目录 npm install webpack@3.6.0 --save-dev (开发时依赖,项目打包不需要继续使用) 或者在package.json中的script中加入webpack(优先在本地查找)

如果在终端中使用webpack,使用的都是全局的webpack

使用webpack前的准备工作

创建两个文件夹 dist文件夹中放最终要发布的打包后的文件 src文件夹中放要被打包的源文件

创建index.html文件为浏览器打开的首页html文件

通过在终端输入npm init命令生成的npm包管理的文件package.json (使用node的项目一般都会有一个package.json文件,包含项目的信息)

使用webpack的方法

在终端使用cd命令找到文件夹,在文件夹内使用 webpack ./src/main.js ./dist/bundle命令即可创建bundle.js文件,这个文件处理了main.js文件中的文件依赖并打包文件,可以直接在index.html中引用./bundle.js文件即可

使用cd ..可以到达上一层文件

webpack会自动将main.js文件中引用的所有文件一起打包,不管是使用CommonJS语法还是ES6语法的都可以打包

出口和入口配置

创建一个webpack.config.js文件可以通过配置webpack来自动完成打包

局部安装webpack配置

目前使用的webpack都是全局的webpack,但在开发项目时往往依赖不同版本的webpack,可能会导致打包时出现问题,所以项目中通常会有自己的webpack

即开发时依赖和运行时依赖

局部安装webpack:cd 对应目录 npm install webpack@3.6.0 --save-dev (开发时依赖,项目打包不需要继续使用)

启动webpack打包方法:

方法一、通过node_modules/.bin/webpack 启动局部webpack进行打包

方法二、在package.json中的script中加入webpack,该命令会优先在本地查找,没有找到会去全局的环境变量查找,通过 npm run build指令进行调用

如果在终端中使用webpack,使用的都是全局的webpack

loader

webpack能够会自动处理js代码之间的相互依赖,但不能够将ES6、TS转化为ES5、将less、scss转化为css,所以需要给webpack扩展相应的loader

loader的使用要先使用npm install xxx-loader进行安装,然后在webpack.config.js文件的modules下进行配置,在package.json文件中可以看到配置loader的版本

1.css文件处理

在css文件夹下创建css文件,要在main.js中对css文件进行引用require('./css/normal.css')

需要同时安装style-loader和css-loader 并在webpack.config.js文件中的module中进行配置

无法安装时可以将--legacy-peer-deps标志传递给npm(e.g.,npm i --legacy-peer-deps),或者使用npm@6。

2.图片处理 url-loader file-loader

图片的编译模式收到limit属性的限制,当加载的图片小于limit时,会将图片编译成base64字符串格式,当加载的图片大于limit时,需要使用file-loader模块进行加载

使用file-loader不需要进行配置

webpack使用file-loader进行打包时会在dist文件夹下生成一个非常长的名字,是32位的hash值,能有效防止名字重复

但在实际开发中不仅要知道图片的名字,还要将图片打包成一个文件夹,所以要在webpack.config.js文件下配置url-loader的option处加上属性name:'img/[name].[hash:8].[ext]'

name是原来的名字;hash值是为了防止重复,为了方便只取八位;ext是extension的缩写,扩展名

3.ES6语法处理

使用webpack打包仍然会使用ES6语法,对不支持ES6语法的浏览器不适用 可以使用babel进行转换

安装:npm install --save-dev bable-loader@7 bable-core bable-preset-es2015

es2015即ES5

使用Vue的配置

安装Vue:npm i vue -s

不仅是开发时用到Vue,运行时也要用到,所以不用--save-dev

Vue发布时构建了两类发布版本,分别是runtime-only和runtime-compiler

runtime-only的代码中不能有任何templateruntime-compiler的代码中可以有template,因为有compiler对模板进行编译

引用runtime-compiler的版本需要以import Vue from 'vue/dist/vue.esm.js'的方式引入

引用runtime-only的版本以import Vue from 'vue'的方式引入即可

vue文件的封装处理

使用webpack对.vue文件进行打包时要安装vue-loadervue-template-compiler两个loader,其中vue-template-compiler的版本要和Vue的版本相同,同时还要修改webpack.config.js文件中的配置

创建Vue时el和template之间的关系

为了在使用组件时不频繁修改index.html中的内容,可以将组件进行打包

在Vue实例中添加template属性,会将template中的内容添加到el所在的位置,在index.html中保留一个基本的div元素即可

使用vetur插件,输入<>即可快速生成 .vue插件模板

输出中的内容和Vue实例相似,但不需要地址和模板,模板在上方的<template>标签处编写,下方style标签可以定义样式

在一个.vue文件中可以import另一个.vue文件作为子组件

plugin插件

一、横幅插件 webpack中自带的插件

const webpack = require('webpack')

//在module.exports对象中加入plugins,冒号后面是数组

plugins: [new webpack.BannerPlugin('wsnd')]

二、打包html文件的插件

在项目真实发布时,index.html文件是放在dist文件夹下的,所以需要插件将index.html打包到dist文件夹中

三、压缩(丑化)js文件的插件

安装 npm i uglifyjs-webpack-plugin --save-dev --legacy-peer-deps版本号和CLI2保持一致

修改配置:plugins: [new uglifyjsWebpackPlugin()]

搭建本地服务器

使用webpack建立一个本地服务器,基于node.js搭建,内部使用express框架,可以实时让浏览器自动刷新显示的结果

安装:npm i --save-dev webpack-dev-server

在配置文件中要加上devServer选项,包含属性:

contentBase:为哪一个文件提供本地服务

port:端口号

inline:页面是否实时刷新

historyApiFallback:在SPA页面中依赖HTML5的history模式

由于是本地服务器,要在package.json文件中加入脚本"dev"="webpack-dev-server"

配置文件的抽离

目的:开发时依赖一个配置文件,发布时依赖另一个

分离

将webpack.config.js文件分成三个文件:公共文件base.config.js、开发时文件dev.config.js、生产时文件prod.config.js

合并

安装:npm i webpack-merge

const webpackMerge = require('webpack-merge')
const base = require('./base.config.js')
module.exports.webpackMerge={base,{dev.config.js里的内容}}

指定配置文件

package.js 文件中脚本修改引用配置文件

    "build": "webpack --config ./build/dev.config.js",
    "dev": "webpack-dev-server --open --config ./build/dev.config.js"

修改输出路径

path: path.resolve(__dirname, './dist')

不加./的话会在build文件夹下创建一个dist文件夹