在很久很久以前,当我们写一个web网页的时候,js实现的逻辑相对是比较弱的。但随着前端技术的发展,前端能实现的内容越来越多。在js里面加了非常非常多的逻辑,于是呢,我们就发现我们通过这种面向过程的方式去写我们的代码。我们的代码就会变得非常的长。后面js里面的逻辑会被堆的越来越大,越来越大,最终变得不可维护。

这个时候我们出现了一种新的编程方式,叫做面向对象编程

index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>这是最原始的网页开发</title>
  </head>
  <body>
    <p>这是我们的网页内容</p>
    <div id="root"></div>
    <script src='./index.js'></script>
  </body>
</html>
index.js
var dom = document.getElementById('root');

var header = document.createElement('div');
header.innerText = 'header';
dom.appendChild(header); var sidebar = document.createElement('div');
sidebar.innerText = 'sidebar';
dom.appendChild(sidebar); var content = document.createElement('div');
content.innerText = 'content';
dom.appendChild(content);
改成
index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>这是最原始的网页开发</title>
  </head>
  <body>
    <p>这是我们的网页内容</p>
    <div id="root"></div>     <script src="./header.js"></script>
    <script src="./sidebar.js"></script>
    <script src="./content.js"></script>
    <script src="./index.js"></script>
  </body>
</html>

header.js

function Header() {
  var header = document.createElement('div');
  header.innerText = 'header';
  dom.appendChild(header);
}
sidebar.js
function Sidebar() {
  var sidebar = document.createElement('div');
  sidebar.innerText = 'sidebar';
  dom.appendChild(sidebar);
}
content.js
function Content() {
  var content = document.createElement('div');
  content.innerText = 'content';
  dom.appendChild(content);
}
index.js
var dom = document.getElementById('root');

new Header();
new Sidebar();
new Content();
这样的话就通过面向对象改造了我们的代码。使用了面向对象使我们的代码更具有维护性。为什么呢?关于header的逻辑全部放到header这个对象里。siderbar的逻辑都放在siderbar这个对象里。这样的话,每一个对象他承载的职责是固定的。那么维护起来就方便的多。比如说如果header里面有问题,原来就需要在index.js里面整篇的去查找哪里有问题。现在如果header里面有问题,只需要打开header.js去查错就可以了。
但是,,,如果我们把代码拆成这个样子,他就带来了新的问题。大家会发现在index.js里面引用了多个js文件。这样的话就会带来几个问题。首先整个页面的加载速度会变慢。因为多出了三个http请求。页面的加载速度当然会变慢。第二点,在index里面看到三个构造函数的创建,但是你并不能知道这每个构造函数对应的文件在哪里,如果你想知道这个文件在哪里的话,你必须要再回头看html文件,你才会发现原来header跟index文件在同一个目录下。所以第二点,看不出代码跟文件之间的关系。第三点很难去查错。假设我这个content.js位置放错了,放在index下面。报错位置是new Content。很难联想到是js位置放错了。所以拆成这样。代码也是不容易维护到。那为了解决这个问题,有人想出了这样一种方式.把index.html,index.js改成这样
index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>这是最原始的网页开发</title>
  </head>
  <body>
    <p>这是我们的网页内容</p>
    <div id="root"></div>
    <script src="./index.js"></script>
  </body>
</html>
index.js
import Header from './header';
import Sidebar from './sidebar';
import Content from './content'; var dom = document.getElementById('root'); new Header();
new Sidebar();
new Content();
那这样写是不是能解决之前的几个问题呢?首先,index.html里只引入了一个js文件。所以他的网页运行速度会很快。第二点,文件和文件之间的依赖关系非常的明确。上面的文件颠倒顺序也不要紧,因为确保了下面引用之前,前面都加载好了。这种引入方式就叫做ES Moudle模块引入方式,跟react,vue里面非常像。
以前写vue,react都能用啊,在这里怎么就报错了呢?其实是这样的,在浏览器里,压根就不认识这样的语句,所以我们想实现我们的代码,目前来看,根据是不可能的。这个时候,webpack就登场了。虽然原生浏览器不知道import是什么意思。但是我webpack知道。webpack知道import是引入模块的意思。他可以帮浏览器做一个翻译,告诉浏览器,这其实在引入一个模块。
所以这个时候,我们可以安装一下webpack,对当前的代码做一次翻译,首先怎么安装呢,首先在命令行里面进入项目目录,运行一下
npm init 项目名
一路回车,然后
npm install webpack webpack-cli
现在在项目的根目录下已经安装好了webpack,那么接下来就是对webpack做一次翻译。怎么翻译呢?
运行一下
npx webpack index.js
他的意思是用webpack去翻译index.js这个文件。翻译过后,根目录下出现了一个dist的文件夹,dist文件夹多了一个main.js文件。这个就是webpack帮你翻译好的文件
这个时候需要把引入的index.js改成dist下面main.js。main是index经过webpack翻译的js文件。这个时候会报错还是,是因为要在要引入的文件里面导出这些文件。export default xxx。

webpack究竟是什么的更多相关文章

  1. Vue 不睡觉教程2 - 洋气的文件结构

    目标书接上回,上回那个例子实在太土了.实际开发中我们不可能把整个网站的js和html全写到一个页面上.所以我们这节课的目标在于改造这个例子的文件结构,让它不那么土Let's do it 环境参数vue ...

  2. 探索 模块打包 exports和require 与 export和import 的用法和区别

    菜单快捷导航: CommonJS 之 exports和require用法 ES6 Module 之 export 和 import 用法 CommonJS和ES6 Module的区别 循环依赖 和 解 ...

  3. webapck学习笔记

    该笔记是博主学习webpack课程时做的笔记,里面加了一些自己的一些理解,也踩了一些坑,在笔记中基本上都更正过来了,分享给大家,如果发现什么问题,望告知,非常感谢. 1. 为什么要学webapck 为 ...

  4. r.js结合gulp等于webpack(angular为例)

    本人大学时玩dojo,开始了AMD模块化的不归路,工作后一直使用requirejs,感觉非常好.但是,近来随着react的火热,webpack成为了天下无敌的模块化工具,能做模块化,合并压缩,监视等, ...

  5. 细说 webpack 之流程篇

    摘自: http://taobaofed.org/blog/2016/09/09/webpack-flow/ 引言 目前,几乎所有业务的开发构建都会用到 webpack .的确,作为模块加载和打包神器 ...

  6. 细说webpack之流程篇

    引言 目前,几乎所有业务的开发构建都会用到 webpack .的确,作为模块加载和打包神器,只需配置几个文件,加载各种 loader 就可以享受无痛流程化开发.但对于 webpack 这样一个复杂度较 ...

  7. webpack务虚扫盲

    打包工具的角色 所谓打包工具在web开发中主要解决的问题是: (1)文件依赖管理.毕竟现在都是模块化开发,打包工具首先就是要梳理文件之间的依赖关系. (2)资源加载管理.web本质就是html.js和 ...

  8. webpack的Hot Module Replacement运行机制

    使用webpack打包,难免会使用Hot Module Replacement功能,该功能能够实现修改.添加或删除前端页面中的模块代码,而且是在页面不刷新的前提下.它究竟是怎么运作的呢?本文主要从调试 ...

  9. webpack+babel项目在IE下报Promise未定义错误引出的思考

    低版本浏览器引起的问题 最近开发一个基于webpack+babel+react的项目,一般本地是在chrome浏览上面开发,chrome浏览器开发因为支持大部分新的js特性,所以一般不怎么需要poly ...

随机推荐

  1. shell脚本检测监控mysql的CPU占用率

    网站访问量大的时候mysql的压力就比较大,当mysql的CPU利用率超过300%的时候就不能提供服务了,近乎卡死状态,这时候最好的方法 就是重启mysql服务.由于这种事具有不可预见性,我们不知道什 ...

  2. Jquery+Aajax 批量上传

    注:转载请标明文章原始出处及作者信息 网上有现成的Uploadify.WebUpload等插件,自己写一个简单的(非插件). 1.页面 批量上传页面 <form action="&qu ...

  3. [android] 与PHP的session进行交互demo

    从MainActivity跳转到MailIndexActivity,第一个请求接口设置session,第二个activity请求接口获取session java代码中获取header头里面的Set-C ...

  4. jmeter单一接口测试

    在使用jmeter进行单一接口测试之前,我们先来了解一下一个用户请求的过程,如下: 1)用户通过浏览器发起一个请求: 2)用户收到服务器返回的响应数据. 如上,就是一个WEB的请求/响应模型 jmet ...

  5. 记录一次Spring Data Solr相关的错误解决

    记录一次Spring Data Solr相关的错误解决 生活本不易,流人遂自安 相信大家也使用过SpringDataSolr,但是在最新版的SpringDataSolr 4.0.5 RELEASE中有 ...

  6. ReentrantReadWriteLock简介

    对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法.假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方 ...

  7. 前端(五):JavaScript面向对象之内建对象

    一.数据类型 js中数据类型分为两种,原始数据累次能够和引用数据类型. 1.原始数据类型 Undefined.Null.Boolean.Number.String是js中五种原始数据类型(primit ...

  8. jQuery源码分析系列 : 整体架构

    query这么多年了分析都写烂了,老早以前就拜读过, 不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍 我也不会照本宣科的翻译源码,结合自己的实际经验一起拜读吧! ...

  9. 车厢调度(train.cpp)

    车厢调度(train.cpp) [问题描述]        有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合.假设从A方向驶来的火车有n节(n<=1000) ...

  10. Apache服务器运维笔记(2)----使用<IfDefine>容器实现不同的配置

    还有一种方法用来实现不同配置的Apache服务器启动,就是在一个配置文件中使用<IfDefine name> ... </IfDefine> 容器来定义,在<IfDefi ...