一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
自学前端
- 前文
- 本文是我自学vue的一些知识以及个人理解, 希望帮助到一些想要学习前端的小白朋友
- 介绍本次学习的是webpack
- 这是基于我学习的笔记而来的文章
- 这不是最新的webpack内容, 是跟随b站王红元codewhy学习的版本
Webpack
- 什么是webpack?
- 官方解释:
- 从本质上来讲, webpack是一个现代的javaScript应用的静模块态打包工具
- 但是它是什么呢?用概念解释概念, 还是不清晰
- 我们从两个点来解释上面这句话: 模块 和 打包
- 前端模块化:
-
目前使用的前端模块化的一些方案: AMD, CMD, CommonJS, ES6
-
在ES6之前, 我们想要进行模块化开发, 就必须借助于其他的工具, 让我们可以进行模块化开发
-
并且在通过模块化开发完成了项目后, 还需要处理模块建的各种一来, 并且将其
将其进行整合打包
-
而webpack其中一个核心就是让我们可能进行模块化开发,
并且会帮助我们处理模块之间的依赖关系
-
而且不仅仅是javaScript文件, 我们的CSS,图片, json文件
等等在webpack中都可以被当做模块来使用
-
这就是webpack中模块化的概念(dist -> distrbution发布 )
-
D:\vscodefile\vue\webpack_run>webpack ./src/main.js ./dist/bundle.js
-
开发时依赖
-
运行时依赖
-
什么是loader
- loader是webpack中一个非常核心的概念
- webpack用来做什么呢?
-
我们之前的实例中, 我们主要是用webpack来处理我们写的js代码, 并且webpack
会自动处理js之间的相关依赖
-
但是, 在开发中我们不仅仅有基本的js代码处理, 我们也需要加载css图片,ES6转ES5, 将ts转ES5, 将scss, less转css
将.jsp .vue 文件转js文件
-
webpack没这个能力
-
给webpack扩展对应的loader就可以了
-
- loader使用过程:
- 步骤一: 通过npm安装需要使用的loader
- 步骤二: 在webpack.config.js中的modules关键字下进行配置
- 大部分loader我们都可以在webpack的官网中找到, 并且学习对应的用法
下载: npm install --save-dev less-loader@4.1.0 less
图片文件处理-修改文件名称
- 我们发现webpack自动帮助我们生成一个非常长的名字
-
这是一个32位hash值, 目的是防止名字重复
-
但是, 真实开发中, 我们可能对打包的图片名字有一定的要求
-
比如, 将所有图片放在一个文件夹中, 跟上图片原来的名称, 同时也要
防止重复img/name.hash:8.ext (哈希值位数限制)
-
- 所以, 我们可以在options中添加如下选项
- img:文件要打包到的文件夹
- name获取图片原来的名字, 放在该位置
- hash: 为了防止图片名称冲突,依然使用hash, 但是我们只保留8位
- ext: 使用图片原来的扩展名
- 但是, 我们发现图片并没有显示出来, 这是因为图片的路径不正确
- 默认情况下, webpack会将生成的路径直接返回给使用者
- 但是, 我们整个程序是打包在dist文件夹下的, 所以这里我们需要在路径下载添加一个dist/
ES6语法处理
-
如果你仔细阅读webpack打包的js文件, 发现写的ES6语法并没有转成ES5, 那么就以为着可能一些对ES6还不支持
的浏览器没有办法很好的运行我们的代码
-
前面我们说过, 如果希望将ES6的语法转成ES5, 那么就需要使用babel
- 而在webpack中, 我们直接使用babel对应的loader就可以了
-
npm install --save-dev babel-loader@7 babel-core babel-preset-es2015
-
重新打包, 查看bundle.js文件, 发现其中的内容变成了ES5的语法
webpack 引入vue.js
- 后续项目中, 我们会使用Vue.js进行开发, 而且会以特殊的文件来组织vue的组件
- 所以, 下面我们来学习一下如何在我们的webpack环境中集成Vue.js
- 现在, 我们希望在项目中使用Vue.js那么必然需要对其有依赖, 所以需要先进行安装
- 注: 因为我们后续是在实际项目中也会使用vue的所以并不是开发时依赖
-
npm install vue --save
- 那么, 接下来就可以按照我们之前学习的方式来使用vue了
- 有两种模式
- runtime-only -> 代码中, 不可以有任何的template
- runtime-compiler -> 代码中, 可以有template, 因为有complier可以用于编译template
el和template区别 (一)
- 正常运行之后, 我们来考虑另外一个问题:
- 如果我们希望将data中的数据显示在界面中, 就必须是修改index.html
- 如果我们后面自定义了组件, 也必须修改index.html来使用组件
- 但html模板在之后的开发中, 我并不希望手动来频繁修改, 是否可以做到呢?
- 定义template属性:
- 在前面的Vue实例中, 我们定义了el属性, 用于和index.html中的#app进行绑定, 让Vue实例之后可以管理它其中的内容
- 这里, 我们可以将div元素中的{{message}}内容删掉, 只保留一个基本的id为div的元素
- 但是如果我们依然希望在其中显示{{message}}的内容, 应该字母处理呢?
- 我们可以再定义一个template属性, 代码如下:
-
new Vue{{ el: '#app', template: '<div id='app'>{{message}}</div>, data: { message: 'coderwhy } }}
.vue文件封装处理
- 一个组件以一个js对象的形式进行组织和使用的时候是非常不方便的
- 一方面编写template模块非常的麻烦
- 另一方面如果有样式的话, 我们写在哪里比较合适呢?
- 现在, 我们以一种全新的方式来组织一个vue的组件
- 但是, 这个时候这个文件可以被正确的加载吗?
- 必然不可以, 这种特殊的文件以及特殊的格式, 必须有人帮助我们处理
- vue-loader以及vue-template-compiler
- 安装npm install vue-loader@15.4.2 vue-template-compiler@2.5.21 --save-dev
- 修改webpack.config.js的配置文件
认识plugin
- plugin是什么?
- plugin是插件的意思, 通常是用于对某个现有的架构进行扩展
- webpack中的插件, 就是对webpack现有功能的各种扩展, 比如打包优化, 文件压缩等等
- loader和plugin的区别
- loader主要用于转换某些类型的模块, 它是一个转换器
- plugin是插件, 它是对webpack本身的扩展, 是一个扩展器
- plugin的使用过程
- 步骤一: 通过npm安装需要使用的plugins(mou写webpack已经内置的插件不需要安装
- 步骤二: 在webpack.config.js中的plugins中配置插件
- 下面就是一些插件
添加版权的plugin
- 我们先来使用一个最简单的插件, 未打包文件添加版权声明
- 该插件的名字叫BannerPlugin, 属于webpack自带的插件
打包html的plugin
- 目前, 我们的index.html文件是存放在项目的根目录下的.
- 我们也知道, 在真实发布项目时, 发布的dist文件夹中的内容, 但是dist文件夹中如果没有index.html文件, 那么打包的js文件也就没有意义了
- 所以, 我们需要将index.html文件打包到dist文件夹中, 这个时候就可已使用HtmlWebpackPlugin插件
- HtmlWebpackPlugin插件可以为我们做这些事情:
- 自动生成一个index.html文件(可以指定模板来生成)
- 将打包的js文件, 通过script标签插入到body中
- 安装HtmlWebpackPlugin插件
-
松开
- 使用插件, 修改webpack.config.js
- 这里的template表示根据什么模板来生成index.html
- 另外, 我们需要删除之前在output中添加的publicPath属性
- 否则插入的script标签中的src可能会有问题
js压缩的plugin
- 在项目发布之前我们必然需要的js等文件进行压缩处理
- 这里, 我们就对打包的js文件进行压缩
- 我们使用第一个第三方的产检uglifyjs-webpack-plugin, 并且版本号指定1.1.1, 和CLI2保持一致
-
npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
- 修改webpack.config.js文件, 使用插件
- :
- 查看打包后的bunnlde.js文件, 是已经被压缩过了
搭建本地服务器
- webpack提供了一个可选的本地开发服务器, 这个本地服务器基于node.js搭建, 内部使用express框架, 可以实现我们想要浏览器自动刷新显示我们修改后的结果
- 不过它是一个单独的模块, 在webpack中使用之前需要先安装它
-
npm install -save-dev webpack-dev-server@2.9.1
- devserver也是作为webpack中的一个选项, 选项本身可以设置如下属性:
- contentBase: 为哪一个文件夹提供本地服务, 默认是根文件夹, 我们这里要填写./dist
- port: 端口号
- inline: 页面实时刷新
- historyApiFallback: 在SPA页面中, 依赖HTML5的history模式
- webpack.config.js文件夹配置修改
-
devServer: {
contentBase: './dist', inline: true}
"dev": "webpack-dev-server --open"
- 我们可以在配置另外一个scripts:
- open参数表示直接打开浏览器
后记
- 希望对对前端有兴趣的朋友们有帮助
- 这篇文章主要是关于webpack的, 希望大家喜欢
- vue的作者是中国人尤雨溪, 非常厉害的人