vue 分模块打包 脚手架_一步步从头搭建 Vue 开发环境

前言

由于是工具,很可能你看到的时候有些工具包已经升级了,会有一些报错;这个你就需要自己探索了。

工具的版本

  1. node: v10.16.0
  2. npm: v6.9.0
  3. babel: 7.5.5
  4. webpack: 4.38.0

入题

提醒:在我们开始之前,你先检查下你相关工具的包是不是和我的一样,以免报一些版本的错误。

首先我们先大致了解下一个完整的脚手架帮我们做了哪些工作:

  1. ES6+ 语法转换成 ES5 语法
  2. .vue 转换成 js 文件
  3. 代码热更新
  4. 加载各种静态资源
  5. 本地提供静态服务 ……

你可以理解成脚手架帮我们完成了业务逻辑之外的大部分繁琐的工程配置,让我们能快速的进入项目的开发。不过这似乎不利于个人的发展,我们作为有格局的前端,这些优工程配置的工作我们也是需要了解的,要不然你又只能回家继承几十亿的家产啦。

下面正式开始:

搭建 webpack 环境

webpack 简单来说就是前端模块化管理工具,这里不讲就具体的用处,如果不懂 webpack 的话建议先学习官方文档:https://www.webpackjs.com。

先确保你的项目中有 package.json 文件,如果没有可以使用 npm init 来创建。

我们先安装 webpack webpack-cli,安装在 devDependencies。

npm install webpack webpack-cli --save-dev

三点解释

--save 和 --save-dev 的区别

  1. --save:将包安装到 dependencies ,简写是 -S
  2. --save-dev:将包安装到 devDependencies 简写是 -D

dependencies 和 devDependencies 的区别

  1. dependencies:运行时的依赖,即这个模块在生产环境下还需要使用;
  2. devDependencies:开发时的依赖。即这个模块只是在开发时使用。

webpack-cli 是什么

webpack4.0 后将 webpack-cli 从 webpack 中分离了出来,所以我们现在需要单独安装。

webpack-cli 为提供了一组灵活的命令,用于在设置自定义 webpack 项目时提高速度。也就是说你没有安装 webpack-cli,你是无法使用 webpack 命令的。

webpack 环境搭建成功了吗?

现在看看 webpack 的环境是否搭建好了。

我们先新建一个文件 src/main.js

922019174a5eee97a10a33c70ff71a6a.png
// main.js 文件代码
const name = '小生方勤';
let hello = `hello ${name}`;

我们运行以下命令后:

webpack ./src/main.js --mode development

发现项目中多了个 dist/main.js 文件,说明 webpack 环境算是安装好了。

0afd25ea1f1f9a09cec5051e64cf84f9.png

不过我们发现代码还是使用的模板字面量语法(ES6 语法),这在部分浏览器是会报错的。所以这个时候我们就需要 Babel 来帮助我们将 ES6+ 的语法转换成浏览器可以识别的语法。

接下来我们就讲讲 Babel 的配置。

为项目配置 Babel

如果你想了解下 Babel,你可以看看之前写的文章 关于 Babel 你必须知道的。

我们先安装相关依赖包:

npm install babel-loader @babel/core @babel/preset-env -D

我们新建一个 build/webpack.config.js 文件并做出如下配置( 配置 babel-loader ):

const path = require('path')

module.exports = {
    mode: 'development',
    entry: {
        // 入口文件
        main: path.resolve(__dirname,"../src/main.js")
    },
    output: {
        // 打包后文件输出的目录
        path: path.resolve(__dirname,'../dist'),
        filename: 'js/[name].[hash:8].js'
    },
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/, // 加快处理速度
                use: [
                    {
                        loader: 'babel-loader'
                    }
                ]
            }
        ]
    }
}

然后我们在根目录新建一个文件 babel.config.js 并做出如下配置:

module.exports = {   
    presets: [
        "@babel/env",
    ]
};

我们再打包试试,你会发现已经转成 ES5 的语法了:

c4daee1a1acf257f0e0fc733257dbbd4.png

不过当你使用一些浏览器不能识别的语法的时候打包的时候就会报错,比如我们代码中使用了 Set():

1b45d12b207728598946eb3a1b2dcd13.png

下面我们就配置 @babel/polyfill。

按需引入 @babel/polyfill

先安装:

npm install @babel/polyfill -S

然后我们在根目录新建一个文件 babel.config.js 并做出如下配置:

module.exports = {   
    presets: [
        [
            "@babel/env",
            {
                useBuiltIns: "usage",  // 按需加载 @babel/polyfill
            },
        ],
    ]
};

这样配置后,打包出来的文件就只是仅仅打包了 polyfill 代码中需要使用的那部分,打包后的体积也大大减少了。

按需加载后文件体积小了 360KB 左右。

小提示: 打包生成的文件是不会自动删除的,需要我们配置 clean-webpack-plugin 插件。

接下来我们开始引入 Vue。

引入 Vue

我们先安装相关的包:

npm install vue -S
npm install vue-loader vue-template-compiler -D

现在项目目录大概是这样的:

62df97ab07c660c06a6bfc885f8f339b.png

然后我们将 main.js 代码改成:

import Vue from 'vue'
import App from './App.vue'

const root = document.createElement('div')
document.body.appendChild(root)

new Vue({
    render: h => h(App)
}).$mount(root)

因为要支持 .vue 文件,所以为我们在 webpack 也需要做相关的配置,即在 webpack.config.js 做如下配置;

...
module: {
    rules: [
        {
            test: /\.vue$/,
            loader: 'vue-loader'
        }
    ]
},
...

注意:vue-loader 在 15.* 之后的版本使用 vue-loader 都是需要依赖 VueLoaderPlugin 的,具体配置见源码。

做到这里是不是想看看这段代码在浏览器的运行结果呢?OK 我们继续配置。

配置 html-webpack-plugin 和 devServer

配置 html-webpack-plugin

npm install html-webpack-plugin -D

我们在根目录新建一个 index.html 文件,然后还是配置 webpack.config.js 文件;

plugins: [
    new CleanWebpackPlugin(),   // 清除 dist 的文件
    new VueLoaderPlugin(),
    new HtmlWebpackPlugin({
        filename: 'index.html',
        template: 'index.html',
        inject: true
    }),
]

打包后 dist 就会多一个 index.html 文件:

ebf35eb3459d1eee0e95624a06fa3cd6.png

我们发现打包后的文件自动插入了 index.html 模板,并生成了一个新的 index.html 文件,细心的朋友应该看到了所有的文件都合并在 main.js 了,等下我就说说该如何把这个文件分开;在之前我们先看看如何实现开发环境热更新。

配置 devServer

先安装包:

npm install webpack-dev-server -D

还是在 webpack.config.js 添加配置:

devServer: {
    host: 'localhost',
    port: 8080,
    hot: true, // 热更新
},
plugins: [
    // 剩略了部分代码,详细的请看源码
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin()
]

然后我们在 package.json 加上一条命令:

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

接着我们就可以运行 npm run dev,我们直接看效果:

98c9eb61c8623342d989af5332e5ff7f.png

到这里我们的项目基本配置都有了,项目已经可以跑起来啦。

再声明下:实际项目中还是使用脚手架为好,这样可以避免很多繁琐的配置。不过项目到底是如何搭建的,我们还是需要了解的;这个过程其实没有什么太多的难点。

参考:

  1. webpack 官方文档:https://www.webpackjs.com
  2. node 官方文档:https://nodejs.org/zh-cn/docs/
  3. babel 官方文档:https://www.babeljs.cn/

◆ ◆ ◆  ◆ ◆

12ccf1ab285f75b0dcf76cf74f1a7a2a.png

长按关注小生

你的在看我当成喜欢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stomp java客户端_Stomp-Spring服务器端的Web套接字Java客户端

stomp java客户端问题&#xff1a; 为了分析问题&#xff0c;我不得不编写一个简单的Java Web套接字客户端站点代码&#xff0c;并使用基于stomp的Web套接字代理连接到服务器端基于Spring的应用程序。 解决方案&#xff1a; pom.xml <?xml version"1.0" encodi…

tf.metrics._将指标标签与MicroProfile Metrics 2.0一起使用

tf.metrics.从我们的应用程序发出的与业务相关的度量标准可能包含要为其测量特定度量标准的参数&#xff08;即标签或标签 &#xff09;。 从MicroProfile Metrics 2.0开始&#xff0c;可以使用API​​将标签分配给特定的指标。 声明式方法 假设我们有以下资源&#xff1a; P…

ppt课堂流程图_除了直线能设计PPT,没想到曲线也实用,太赞了!

前几天在分享PPT设计的方法时&#xff0c;收到反馈&#xff0c;问这种曲线是如何设计以及怎么用&#xff1f;其实对于曲线&#xff0c;如果用好了比直线更加有效果&#xff0c;曲线本身自带动态效果&#xff0c;看一下。除此之外&#xff0c;曲线不仅可以用在PPT中&#xff0c;…

算法分析

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff1b;旨在了解 算法分析涉及到的数学基础、时间复杂度分析法则、和其它的一些法则 和 结论&#xff1b; 【1】 数学基础 1.1&#xff09;本书将使用以下4个定义&#xff1a; 对上述定义的分析&#xff0…

java文件端点续传效果图_Java单依赖性Dockerized HTTP端点

java文件端点续传效果图在本文中&#xff0c;我们将创建一个基于Java的HTTP端点&#xff0c;使用它创建一个可执行jar&#xff0c;将其打包在Docker中并立即在本地运行。 本文面向初学者&#xff0c;他们想要寻找一个简单的演练来在Docker中运行Java应用程序。 描述Dockerize…

立镖机器人浙江_立镖在美国获2020 NextGen供应链解决方案奖

Tompkins Robotics荣获2020 NextGen供应链解决方案提供商奖汤普金斯国际被《供应链管理评论》指定为机器人技术类获奖者2020年3月20日消息Tompkins International的业务部门 Tompkins Robotics被选为第二届年度NextGen供应链奖的获得者。汤普金斯机器人技术公司是《供应链管理…

final 实例域+final类+final方法(阻止继承)

【0】README 0.1&#xff09;本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理清 “final 实例域”&#xff1b; 0.2&#xff09; 最后还增加了 阻止继承 的内容&#xff0c;涵盖了final类final方法&#xff1b; 0.3&#xff09; 引入了 内联 以及 即时编译器对…

java责任链设计模式_Java中的责任链设计模式

java责任链设计模式在本教程中&#xff0c;我们将学习如何在Java中实现责任链模式。 责任链设计模式涉及到拥有一系列负责处理请求的对象链。 当客户端发送请求时&#xff0c;第一个处理程序将尝试处理该请求。 如果可以处理&#xff0c;则请求处理在此结束。 但是&#xff0c…

机加工程序工时程序_团宠来袭 | 针对多品种小批量的机加工柔性生产解决方案...

“天下之至柔&#xff0c;驰骋天下之至坚。无有入于无间&#xff0c;吾是以知无为之有益。”老子指出&#xff0c;世间最柔弱的东西里面往往蓄着人们看不见的巨大力量&#xff0c;使得最坚强的东西也无法抵挡。就像水是最柔的东西&#xff0c;但却能穿透山地。柔性的力量不容小…

静态方法+工厂方法(静态方法用途)

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在了解 “静态方法”&#xff1b; 【1】静态方法相关 1.1&#xff09;静态方法是一种不能向对象实施操作的方法&#xff1b; 如&#xff0c;Math.pow(x, a)&#xff0c; 在运算时&#…

一致吗 驱动_iPhone 12无线充电真的香吗?

2020年10月14日凌晨1点&#xff0c;苹果发布会又来了&#xff0c;开场就是苹果CEO库克在总部贾伯斯剧院闪亮登场&#xff01;没错&#xff01;各位果粉心心念念的 iPhone 12 它走来了&#xff01;如之前爆料所言&#xff0c;本次发布会共推出了4款机型&#xff1a;iPhone 12 mi…

spring boot注释_Spring Boot中的@SpringBootConfiguration注释

spring boot注释Spring Boot中的 SpringBootConfiguration注释是一个类级别的注释&#xff0c;它指示此类提供了应用程序配置。 通常&#xff0c;具有main&#xff08;&#xff09;方法的类最适合此注释。 我们通常使用SpringBootApplication批注&#xff0c;该批注会自动继承…

selenium自动化测试_Selenium测试可实现有效的测试自动化

selenium自动化测试尽管移动应用程序的市场份额有大幅增长&#xff0c;但网络应用程序仍然具有大量的用户基础。 在部署之前&#xff0c;企业正在关注Web应用程序的质量。 这是测试发挥重要作用的地方。 与某些可以自动化的功能测试不同&#xff0c;UI测试仍然大部分是手动过程…

画时序图 visual_时序图的初步了解

1、划清边界&#xff0c;识别交互的语境所谓划清边界&#xff0c;就是要界定好自己所要画的时序图的范围&#xff0c;“学生在教务系统中查询其课程的成绩”就是所要绘制的时序图的交互内容&#xff0c;不用往上延伸到用户登录&#xff0c;也不要往下延伸到下载成绩单。识别交互…

java 初始化块

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在分享初始化块 or 静态初始化块的调用过程&#xff1b; 【1】初始化块相关 1.1&#xff09;前面讲过了 两种初始化数据域的方法&#xff1a; 在构造器中设置值 在声明中赋值&#xff…

简短介绍_中秋节的来历由来简短20字30字 中秋节的起源50字100字简介

中秋节是我国的传统佳节。按照史籍的记实&#xff0c;“中秋”一词最早呈此刻《周礼》一书中。小编整理了中秋节来历的简单介绍&#xff0c;既有二三十字的简要版&#xff0c;也有100字左右的介绍&#xff0c;让我们一起了解中秋节的起源吧。中秋节的来历由来简短20字中秋节起源…

java中的lombok_如何在Java中使用Lombok删除样板设置器吸气剂

java中的lombok你好朋友&#xff0c; 一次又一次反对Java的观点之一是&#xff0c;我们必须写很多样板 我们简单的POJO类的setter和getter形式的代码&#xff0c;不必要地增加了 我们代码的长度。 为了解决这个问题&#xff0c;有一个名为Project Lombok的开源项目可以解决这…

super 和 this 关键字的比较+调用构造器(this)+动态绑定

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在加深对 super 和 this关键字 的用法比较&#xff1b; 0.2&#xff09; 最后还补充了 多态和动态绑定 的定义 以及对动态绑定进行了详细分析&#xff0c;这两个定义给的非常棒&#xf…

修改表格字体颜色_word排版应用:如何创建文本样式和表格样式

样式&#xff0c;大家应该不陌生&#xff0c;在Word中是一个非常强大的功能&#xff0c;运用得好&#xff0c;可以节省很多时间和精力。但如果你不会用&#xff0c;关键时刻可以把你急哭了&#xff01;在前面的“Word样式&#xff0c;简单又实用&#xff01;”和“Word样式也有…

java流式传输对象_Java性能:面向教学与流式传输

java流式传输对象在for循环中向上或向下计数是最有效的迭代方式吗&#xff1f; 有时答案既不可行。 阅读这篇文章&#xff0c;了解不同迭代品种的影响。 迭代性能 关于如何以高性能进行迭代有很多观点。 Java中的传统迭代方式是一个for循环&#xff0c;该循环从零开始&#xf…