位置: 编程技术 - 正文

详解从零搭建 vue2 vue-router2 webpack3 工程(搭建入门)

编辑:rootadmin

推荐整理分享详解从零搭建 vue2 vue-router2 webpack3 工程(搭建入门),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:搭建方法步骤,搭建dg,搭建教程,搭建入门,搭建vulhub,搭建dg,手把手教你搭建,搭建教程,内容如对您有帮助,希望把文章链接给更多的朋友!

以新手视角,详细介绍各个步骤内容,不深入讲步骤涉及的原理,主要介绍如何操作。

初始化工程

新建工程目录 vue2practice,在目录下执行npm init -y来创建一个 package.json,在 package.json 中先添加以下必备模块:

其中 vue-template-compiler 是 vue-loader 的 peerDependencies,npm3 不会自动安装 peerDependencies,然而 vue-template-compiler 又是必备的,那为什么作者不将其放到 dependencies 中呢?有人在 github 上提过这个问题,我大致翻译一下作者的回答(仅供参考):这样做的原因是因为没有可靠的方式来固定嵌套依赖的关系,怎么理解这句话?首先 vue-template-compiler 和 vue 的版本号是一致的(目前是同步更新),将 vue-template-compiler 指定为 vue-loader 的 dependencies 并不能保证 vue-template-compiler 和 vue 的版本号是相同的,让用户自己指定版本才能保证这一点。查看作者的回答(英文) 。如果两者版本不一致,运行时会出现下图所示的错误提示。

新建目录结构如下,新增的目录及文件先空着,后面的步骤会说明添加什么内容。

配置Webpack

Webpack 默认读取 webpack.config.js,文件名不能随便改,其中 entry 是必须配置的。

Webpack 2+ 要求output.path必须为绝对路径。

配置 webpack-dev-server,只需在 package.json 添加以下启动命令即可。

webpack-dev-server 2 默认为 inline 模式,热模块替换仍需自己设置。

验证配置

在 index.html 中添加测试代码,引入打包后的 JS 文件。

在 main.js 中添加测试代码。

执行下面的命令来安装模块并启动服务器。

启动后浏览器会自动打开 main.js 和 index.html 的内容,改动 main.js 后浏览器不刷新能看到效果,则表示配置没问题。

Vue

新建页面

在 views 目录下新建 index.vue。

webpack 1 需要特定的 loader 来转换 ES import/export,webpack 2 起可以开箱即用。但是 ES6 的新语法还是需要 loader 来转换,在没有配置前,先不要用新语法。用了也没报错(比如 let,const等),那是因为你的浏览器已经支持了 ES6 语法(新版本浏览器都已经支持)。

配置路由

将 vue-router 实例化传入的参数new VueRouter(参数)提取到 router.js 形成路由配置文件。

从 vue-loader@.0.0,不能用 require 来引入 .vue 文件,因为 .vue 文件最终会被编译成 ES6 module。

首页

首页引入 ouput 配置的 JS,添加 Vue 实例的挂载目标。

入口JS完成路由配置、初始化 Vue 实例。

从 Vue 2.2.0 后使用 require('vue') 会报错,应使用 ES6 module(import),具体原因请参考 Vue 更新说明 app.vue 中添加路由链接、路由视图组件。

配置loader

配置 vue 文件对应的 loader。

Webpack2 必须在 module.rules 下配置 loader。'-loader'不能省略,必须将 loader 名写全。可以使用 Rule.use 或 Rule.loader 来配置 loader(Rule.loader 是 Rule.use: [ { loader } ] 的简写),建议用 use。

上面完成了新增页面及访问该页面所需的配置,下面来测试下是否能正常访问/index。执行npm run dev,浏览器显示如图界面。

支持CSS

安装 css-loader 后即可在 vue 文件中使用

想要支持import / require引入CSS文件,则需要配置对应的 Rule。

支持CSS预处理语言

以 stylus 为例,安装 stylus 及 stylus-loader。

增加 .styl 文件对应的 loader 配置。

使用示例:

node-sass 安装慢的解决办法

使用淘宝镜像:

也可以单独设置node-sass镜像:

支持图片及图标字体

安装图片及图标字体依赖的loader。

增加图片及图标字体的loader配置。

构建

添加打包命令如下:

执行npm run build开始构建,完成后,可以看到工程目录下多了dist目录以及 dist/build.js。

使用 Webpack 插件

压缩JS

在之前的文章提到过,打开未压缩版的build.js,你会发现ES6的语法没有被转化为ES5,因此需要安装babel 套件来完成语法的转化,否则压缩的时候就会报错。之前广泛使用的转码规则为 babel-preset-es,但 Babel 的官网上在9月宣布 ES / ES/ ES 等等 ESxx 时代的 presets 通通被废弃(deprecated),取而代之的是 babel-preset-env,并且承诺它将成为“未来不会过时的(future-proof)”解决方案。

增加babel的配置文件.babelrc。

将 modules 设置为 false,即交由 Webpack 来处理模块化,通过其 TreeShaking 特性将有效减少打包出来的 JS 文件大小,可以自行对比下前后打包出来的文件的大小,效果还是不错的。

comments 即是否保留注释。

接着配置 JS 文件的 loader。

注意:Webpack2建议尽量避免exclude,更倾向于使用include。

压缩 JS 采用webpack.optimize.UglifyJsPlugin,配置如下:

官网称warnings默认为false,你可能会遇到即使没有配置warnings: true,控制台仍显示警告,看下面这段源码就知道了。查看源码

只有当options.compress !== false时 warnings 才会被设置默认值 false,所以一旦配置了 compress 其它选项,那就需同时配置warnings: false。

warnings作用是当插件在压缩过程中移除的无效代码或定义是显示警告信息(display warnings when dropping unreachable code or unused declarations etc.)。

详解从零搭建 vue2 vue-router2 webpack3 工程(搭建入门)

提取CSS

使用extract-text-webpack-plugin插件提取CSS。更改 css 及 less 的 loader 配置如下。

上述配置并不能提取 vue 文件中的 style,需要设置 vue-loader 参数才可以。

初始化插件,filename 可以指定 CSS 文件的目录。

PostCSS

安装 postcss-loader 及 postcss 插件。

配置 loader 如下:

postcss-loader 要放在 css-loader 和 style-loader 之后,CSS 预处理语言 loader 之前(stylus-loader)。

新增 postcss.config.js 来配置postcss插件,这样就不用给每个 postcss-loader 去配置。更多 postcss-loader 的配置方式请参考 postcss-load-config。

cssnano 使用了一系列 postcss 插件,包含了常用的 autoprefixer 等,如何传入 autoprefixer 的配置?

其中有一个插件 postcss-zindex 使用中发现有些问题。如果想禁用这个插件的话,配置如下:

附:postcss插件分类搜索网站: html-webpack-plugin 插件。

初始化插件。

其它插件

Webpack3 新增的作用域提升。

指定生产环境,以便在压缩时可以让 UglifyJS 自动删除代码块内的警告语句。

因为这个插件直接做的文本替换,给定的值必须包含字符串本身内的实际引号。通常,有两种方式来达到这个效果,使用 '"production"', 或者使用 JSON.stringify('production')。

你完全可以在自己的代码中使用process.env.NODE_ENV来区分开发和生产,从而针对不同的环境做一些事情。不用担心这部分代码会被保留,最终会被 UglifyJS 删除。例如:

使用上述插件后再次构建,会发现生成的JS相比原来的体积小了不少。

friendly-errors-webpack-plugin 是一个更友好显示 webpack 错误信息的插件。插件 github 地址: webpack 编译控制台打印的信息的插件webpack-dashboard

分离Webpack配置

将开发和生产配置文件分离,方便增加各个环境下的个性配置。Webpack2文档中也详细阐述了如何为多环境配置webpack。基本思路如下:

编写一个基本配置文件(webpack.base.config.js) 使用webpack-merge合并这个基础配置和针对环境的特定的配置(webpack.dev.config.js,webpack.prod.config.js)

webpack.base.config.js 内容如下:

为什么要将vue-loader的options提取出来?其主要是用来配置CSS及CSS预处理语言的loader,开发环境可以不用配置,但是生产环境需要提取CSS、增加postcss-loader等,因此需要提取出来针对不同环境返回相应的options。后面会列出utils.vueLoaderOptions的内容。

为什么没有配置CSS的loader?理由和上面的vue-loader一样。

为什么没有配置path和publicPath?一方面是个性化参数,另外开发和生产可能不相同,因此在webpack.dev.config和webpack.prod.config中分别配置更为合适。

webpack.dev.config.js 内容如下:

添加了HtmlWebpackPlugin后,index.html中就不需要在自己去引用打包的JS了,会自动根据打包的JS添加引用,这样更加方便,关于HtmlWebpackPlugin的配置,需要说明两点:

1.template的路径是相对于webpack编译时的上下文目录,说白了就是项目根目录,因此上面可以直接配置index.html,其指向的就是根目录下的index.html;

2.filename则是相对于webpack配置项output.path(打包资源存储路径)。

html-webpack-plugin关于template和filename路径源码如下:

config.js内容如下:

utils.js内容如下:

接下来就是如何启动webpack-dev-server,vue-cli的webpack模板工程用的express及webpack中间件做开发服务器,其实用webpack-dev-server就能满足需求,当然用express能够做更多的事情,毕竟webpack-dev-server是一个轻量级的express。dev.js内容如下:

生产配置文件(webpack.prod.config.js)内容如下:

生产构建(prod.js)内容如下:

对应在package.json中添加开发和生产构建的命令如下:

代码分割

参照vue-cli及webpack文档的提取公共代码的方式,利用插件webpack.optimize.CommonsChunkPlugin将来自node_modules下的模块提取到vendor.js(一般来讲都是外部库,短时间不会发生变化)。于是有如下代码:

如果你查看未压缩版的vendor.js,会发现不仅包含vue的代码,还包含了webpackBootstrap(webpack模块加载器)的代码,按理说放在vendor里面也没啥问题,毕竟后面的模块都需要依赖于此,但是如果你的chunk使用了hash,一旦app代码发生了改变,相应的hash值会发生变化,webpackBootstrap的代码也会发生变化(如图),而我们提取vendor的初心就是这部分代码改变频率不大,显然这不符合我们的目标,那么应当将webpackBootstrap再提取到一个文件中,代码如下:

用 import 还是 require

vue 2.2.0 后不能直接使用 require 来加载 vue,那么到底改是该使用 ES6 Module 还是 CommonJS 呢?,先看一个对比图:

全部使用 ES6 Module,即import、export default,最终打包的app.js为1.KB。

全部使用 CommonJS(除了vue),即require、module.exports,最终打包的app.js为1.KB。

虽然两者大小相差不大,但是这不禁让人觉得用 CommonJS 似乎是一条优化措施,那么代码层面到底是怎么回事呢?

为了一探究竟,注释了压缩插件,以about.vue最终构建的代码来看,使用 CommonJS 的代码如下:

这基本上和 about.vue 中的代码相差无几,而使用 ES6 Module 构建的代码如下:

对比两种规范下构建后的代码,使用 ES6 Module 主要是多了 Object.defineProperty 那一部分,从而导致了最终打包的文件大一点儿。那是不是为了最终文件体积能小些就全部使用 CommonJS 呢?这个需要你充分理解 CommonJS 和 ES6 Module 的区别,引用《ECMAScript 6入门》这本书的解释如下:

ES6模块加载的机制,与CommonJS模块完全不同。CommonJS模块输出的是一个值的拷贝,而ES6模块输出的是值的引用。

为了更清楚的理解这段话,我们稍微做一下测试,在 src 下增加一个test.js,内容如下(分别将两种写法列出):

在about.vue中测试如下:

最终的输出值也印证了前面的解释,更详细的解读请查阅相关资料或书籍。只有深入理解了两者的区别,自然就能明白何时该使用何种规范。当然 ES6 作为未来的趋势,我们应该去做更多的尝试。

异步组件(懒加载)

之前用懒加载的方式是:require.ensure,在 webpack2 中引入了 Code Splitting-Async 的新方法 import(),用于动态引入 ES Module。require.ensure 可以指定 chunkFilename,但是 import 没有很好的途径去指定,webpack3 为了解决这个问题,提出了用魔法注释的方式来指定模块名。

结合 vue-router 可以轻松实现懒加载,配置路由指向异步组件即可实现懒加载,比如:

如果你发现使用 import() 运行时报错,有几种情况:1.babel presets 配置为 es,则不支持动态导入功能,因此需要安装支持动态导入的 presets(npm i babel-preset-stage-2 -D),或者 babel 插件(npm i babel-plugin-syntax-dynamic-import -D);2.babel presets 配置为 env,但是 modules 配置为 false,babel 则不会解析 import,可以安装插件 (npm i babel-plugin-syntax-dynamic-import -D)解决。

魔法注释虽然指定了块名,但是 webpack 默认的块名配置为 [id].js,即用的模块的 id 作为块名,因此需要我们手动改下配置。

修改 webpack.base.config.js 的 output:

效果如下图:

如果发现魔法注释没有生效,要检查下 .babelrc 的配置项 comments 是否设为 true。或者不配置 comments(默认为true)

extract-text-webpack-plugin 默认不会提取异步模块中的 CSS,需要加上配置:

标签: 搭建入门

本文链接地址:https://www.jiuchutong.com/biancheng/377418.html 转载请保留说明!

上一篇:利用vue+elementUI实现部分引入组件的方法详解(利用职务之便谋取私利是什么罪)

下一篇:利用vue + koa2 + mockjs模拟数据的方法教程(利用职务之便谋取私利是什么罪)

  • 金蝶kis专业版的优缺点
  • 外籍人员可以在中国工作吗
  • 用友t3软件的系统内没有利润表模块
  • 已启动申报比对异常申报,可以作废嘛清卡吗
  • 收到投资款的会计科目
  • 子公司的实收资本合并报表怎么做
  • 制造费用明细账实例图
  • 小规模纳税人购车可以抵扣多少税
  • 营改增后转让土地使用权增值税
  • 哪些税不可以扣除
  • 营改增后小规模纳税人所得税
  • 所得税预缴申报表利润
  • 淘宝开企业店铺需要什么资料
  • 偷税罪立案标准最新
  • 活动策划税费
  • 小型微利企业所得税优惠政策2022
  • 金融服务利息税率是多少
  • 跨年度多计提的社保调整
  • 不交社保一告一个准罚多少钱
  • 建材销售公司需要交哪些税
  • 电子税务局怎么变更财务负责人
  • 房地产企业资金监管账户
  • 出口退税系统中的出口货物已补税未退税证明怎么填
  • 手机中的流量统计在哪里寻找
  • 关闭系统保留空间
  • 仓库折旧费
  • 补缴配套费
  • 进项税和销项税怎么理解
  • 小规模纳税人的专票可以抵税吗
  • 销售环节的运费怎么算
  • 房屋租赁合同变更
  • 购买的烟酒怎么入账科目
  • WIN7系统的镜像文件在哪里
  • 苹果电脑设置壁纸为什么重启就没了
  • macbook 运行windows
  • 当月认证了发票但没有进行增值税申报
  • 黄金期货交易进场规则
  • 季度利润表中的营业收入怎么算
  • html+javascript
  • 旋转 目标检测
  • 企业季度所得税怎么算
  • 资产处置损益计算公式
  • vue3.0实战项目
  • tune a video:one-shot tuning of image diffusion models for text-to-video generation
  • vue2vue3的区别
  • 税控盘抵扣怎么做账
  • 社保基数是按基本工资还是应发工资
  • 视同销售实物出资是否开专票吗
  • 企业现金支付的范围
  • 如何做进项税额明细表
  • 帝国cms界面
  • 你用python做什么
  • 成本会计制造费用核算的内容
  • 内账收入和成本怎样做
  • 一般纳税人按简易办法计税销售额
  • 公司购进设备会计分录
  • 起重机属于固定资产中什么设备类型
  • 交强险还要交车船税?
  • 发票作废才能验旧吗
  • 键盘和鼠标冲突
  • linux 维护命令
  • centos 安装chia
  • awk 筛选有特定字符
  • 桌面上有desktop.ini文件
  • win7网络连接无internet简单修复方法
  • 原生java web
  • 适配器模型
  • androidsocket原理
  • python算法简单编程题
  • insmod: init_module 'hello.ko' failed (Exec format error)
  • javascript编程基础
  • js的实现原理
  • js点击代码
  • python数学题
  • 掌上税务app
  • 地税电子税务局漏报要去大厅吗
  • 个人医保缴费证明怎么打印
  • 综述与系统综述
  • 什么是免抵税额和免抵退税额
  • 什么叫企业改制重组
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设