本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle。javascript
Webpack 是当下最热门的前端资源模块化管理和打包工具,它能够将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还能够将按需加载的模块进行代码分离,等到实际须要时再异步加载。经过 loader 转换,任何形式的资源均可以当作模块,好比 CommonsJS、AMD、ES六、CSS、JSON、CoffeeScript、LESS 等;css
WebPack 是一款模块加载器兼打包工具,它能把各类资源,如 JS、JSX、ES六、SASS、LESS、图片等都做为模块来处理和使用。html
Webpack是一个前端资源的打包工具,它能够将is、image、sss等资源当成一个模块进行打包(下图展现了全部的js打包成一个js,css打包成一个css等)前端
<script src="module1.js"></scirpt> <script src="module2.js"></scirpt> <script src="module3.js"></scirpt> <script src="module4.js"></scirpt>
这是最原始的 JavaScript 文件加载方式,若是把每个文件看作是一个模块,那么他们的接口一般是暴露在全局做用域下,也就是定义在 window
对象中,不一样模块的调用都是一个做用域。vue
这种原始的加载方式暴露了一些显而易见的弊端:java
<script>
的书写顺序进行加载 服务器端的 NodeJS 遵循 CommonsJS 规范,该规范核心思想是容许模块经过 require
方法来同步加载所需依赖的其它模块,而后经过 exports
或 module.exports
来导出须要暴露的接口。node
require("module"); var test = require("../module.js"); test.test(); export.doStuff = function() {}; module.exports = someValue;
Asynchronous Module Definition 规范其实主要一个主要接口 define(id?, dependencies?, factory);
它要在声明模块的时候指定全部的依赖 dependencies
,而且还要当作形参传到 factory
中,对于依赖的模块提早执行。python
Asynchronous Module Definition 规范其实主要一个主要接口 define(id?, dependencies?, factory);
它要在声明模块的时候指定全部的依赖 dependencies
,而且还要当作形参传到 factory
中,对于依赖的模块提早执行。jquery
define("module", ["dep1", "dep2"], function(d1, d2) { return someExportedValue; }); require(["module", "../file.js"], function(module, file) {});
Commons Module Definition 规范和 AMD 很类似,尽可能保持简单,并与 CommonsJS 和 NodeJS 的 Modules 规范保持了很大的兼容性。webpack
define(function(require, exports, module) { var $ = require("jquery"); var Spinning = require("./spinning"); exports.doSomething = ...; module.exports = ...; });
EcmaScript6 标准增长了 JavaScript 语言层面的模块体系定义。 ES6 模块的设计思想,是尽可能静态化,使编译时就能肯定模块的依赖关系,以及输入和输出的变量。CommonsJS 和 AMD 模块,都只能在运行时肯定这些东西。
import "jquery"; export function doStuff() {} module "localModule" {}
能够兼容多种模块风格,尽可能能够利用已有的代码,不只仅只是 JavaScript 模块化,还有 CSS、图片、字体等资源也须要模块化。\
用webpack实现
Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dah开发,实质是对Chrome V8引擎进行了封装。Node js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。
V8引擎执行Javascript的速度很是快,性能很是好。Nodejs是一个基于Chrome JavaScript运行时创建的平台,用于方便地搭建响应速度快、易于扩展的网络应用。Nodejs使用事件驱动,非阻塞/O模型而得以轻量和高效,很是适合在分布式设备上运行数据密集型的实时应用。
npm config set prefix "D:\nodejs\npm_modules" npm config set cache "D:\nodejs\npm_cache"
将D:\nodejs\npm_modules添加到环境变量中
npm install -g cnpm --registry=https://registry.npm.taobao.org
查看cnpm版本
cnpm -v
切换cnpm镜像地址(执行下面命令须要去下载好的nrm目录,若是没有添加环境变量)
cnpm install -g nrm //安装 nrm ls //查询当前指向的镜像地址 nrm use taobao //切换到淘宝镜像
npm install webpack -g npm install webpack-cli -g
建立 webpack.config.js
配置文件
module.exports = { entry: "", //指定入口文件(main.js) output: { path: "", //须要是绝对路径,默认是./dist/filename.js filename: "" }, module: { loaders: [ {test: /\.js$/, loader: ""} ] }, plugins: {}, resolve: {}, watch: true }
直接运行 webpack
命令打包
modules
的目录,用于放置 JS 模块等资源文件hello.js
,用于编写 JS 模块相关代码main.js
的入口文件,用于打包时设置 entry
属性webpack.config.js
配置文件,使用 webpack
命令打包index.html
,导入 WebPack 打包后的 JS 文件须要将某些被其余js须要的方法导出(exports是ES5语法)
exports.sayHi = function () { document.write("<div>Hello WebPack</div>"); };
若是须要将多个方法导出
var function01 = funciotn(){}; var function02 = function(){}; exports.function01 = function01; 方式1:直接一个一个的导出 exports.function02 = function02; 方式2: exports = {function01,function02}
设置它为入口
导入须要的js
var hello = require("./hello"); //导入hellow.js(能够不加后缀) hello.sayHi();
webpack.config.js
的配置文件主要目的:将上面的两个js打包成一个js,因为main.js依赖了hellow.js,因此他们会打包在一块
module.exports = { entry: "./modules/main.js", output: { filename: "./js/bundle.js" } };
index.html
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script src="dist/js/bundle.js"></script> </body> </html>
# 用于监听变化 webpack --watch //在webpack.config.js 中的配置能够省略watch=true配置
运行 HTML 文件,你会在浏览器看到:
Hello WebPack
model01.js
var add = function (x, y) { return x+y; } var add2 = function (x, y) { return x+y+2; } module.exports.add = add; // module.exports ={add,add2};//若是有多个方法这样导出 // module.exports.add2 = add2//若是有多个方法也能够这样导出
main.js(主文件)
//导入model01.js var {add} = require("./model01.js") var Vue = require("./vue.min.js") var VM = new Vue({ el:'#app',//vm接管了app区域的管理 //model数据 data:{ num1:0, num2:0 } });
webpack.config.js(必定须要添加否则报错)
module.exports = { entry: "./main.js", output: { filename: "build.js" } };
打包命令
webpack
效果
build.js并无真正生成;
推荐使用webpack-dev-server开发服务器,它的功能能够实现热加载而且,自动刷新浏览器。
此时咱们在开发中就能够再也不使用nginx作服务器了
cnpm install webpack@3.6.0 webpack-dev-server@2.9.1 html-webpack-plugin@2.30.1 --save-dev
npm init
"scripts": { "dev": "webpack-dev-server --inline --hot --open --port 5008" },
·
//引用html-webpack-plugin插件,做用是根据html模板(vue_02.html)在内存生成html文件,它的工做原理是根据模板文件在内存中生成一个index.html文件。 var htmlwp = require('html-webpack-plugin'); module.exports={ entry:'./src/main.js', //指定打包的入口文件 output:{ path: __dirname+'/dist', // 注意:__dirname表示webpack.config.js(当前文件)所在目录的绝对路径(默认也是这个路径) filename:'build.js' //输出文件(没有真正的生成) }, //devtool: 'eval-source-map', plugins:[ new htmlwp({ title: '首页', //生成的页面标题<head><title>首页</title></head> filename: 'index.html', //webpack-dev-server在内存中生成的文件名称,自动将build注入到这个页面底部,才能实现自动刷新功能 template: 'vue_02.html' //根据vue_02.html这个模板来生成(这个文件请程序员本身生成) }) ] }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue.js经常使用指令的测试</title> </head> <body> <div id="app"> <input type="text" v-model="num1"/> + <input type="text" v-model="num2"/>= <span v-text="Number.parseInt(num1)+Number.parseInt(num2)"></span> <span v-text="result"></span> <button v-on:click="change">计算</button> </div> </body> <!--<script src="vue.min.js"></script>--> <!--<script src="dist/build.js"></script>--> </html>
var {add} = require("./model01") var Vue = require("./vue.min") var VM = new Vue({ el:'#app',//vm接管了app区域的管理 data:{//model数据 num1:0, num2:0, result:0 }, methods:{ change:function () { //必需要有this(会修改data中的result数据) this.result = add(Number.parseInt(this.num1),Number.parseInt(this.num2)) } } });
model01.js
var add = function (x, y) { return x+y; } var add2 = function (x, y) { return x+y+2; } module.exports.add = add; // module.exports ={add,add2};//若是有多个方法这样导出 // module.exports.add2 = add2//若是有多个方法也能够这样导出
一、在webpack.config.js中添加 devtool: 'eval-source-map',
二、在须要打上断点的js中添加debugger
methods:{ change:function () { debugger //调试 this.result = add(Number.parseInt(this.num1),Number.parseInt(this.num2)) } }
效果