这是最原始的JavaScript文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在window对象中,不同模块的调用都是一个作用域。 这种原始的加载方式暴露了一些显而易见的弊端:
全局作用域下容易造成变量冲突文件只能按照<script>的书写顺序进行加载开发人员必须主观解决模块和代码库的依赖关系在大型项目中各种资源难以管理,长期积累的问题导致代码库混乱不堪服务器端的NodeJS遵循CommonsJS规范,该规范核心思想是允许模块通过require方法来同步加载所需依赖的其它模块,然后通过exports或module.exports来导出需要暴露的接口。
require("module"); require("../module.js"); export.doStuff = function(){}; module.exports = someValue;优点:
服务器端模块便于重用NPM中已经有超过45万个可以使用的模块包简单易用缺点:
同步的模块加载方式不适合在浏览器环境中,同步意味着阻塞加载,浏览器资源是异步加载的不能非阻塞的并行加载多个模块实现:
服务端的NodeJSBrowserify,浏览器端的CommonsJS实现,可以使用NPM的模块,但是编译打包后的文件体积较大modules-webmake,类似Browserify,但不如Browserify灵活wreq,Browserify的前身Asynchronous Module Definition规范其实主要一个主要接口define(id?,dependencies?,factory);它要在声明模块的时候指定所有的依赖dependencies,并且还要当做形参传到factory中,对于依赖的模块提前执行。
define("module",["dep1","dep2"],functian(d1,d2){ return someExportedValue; }); require(["module","../file.js"],function(module,file){});优点
适合在浏览器环境中异步加载模块可以并行加载多个模块缺点
提高了开发成本,代码的阅读和书写比较困难,模块定义方式的语义不畅不符合通用的模块化思维方式,是一种妥协的实现实现
RequireJScurlCommons Module Definition规范和AMD很相似,尽保持简单,并与CommonsJS和NodeJS的Modules规范保持了很大的兼容性。
define(function(require,exports,module){ var $=require("jquery"); var Spinning = require("./spinning"); exports.doSomething = ...; module.exports=...; });优点:
依赖就近,延迟执行可以很容易在NodeJS中运行缺点依赖SPM打包,模块的加载逻辑偏重实现
Sea.jscoolieEcmaScript 6标准增加了JavaScript语言层面的模块体系定义。ES 6模块的设计思想, 是尽量静态化, 使编译时就能确定模块的依赖关系, 以及输入和输出的变量。Commons JS和AMD模块,都只能在运行时确定这些东西。
import "jquery" export function doStuff(){} module "localModule"{}优点
容易进行静态分析面向未来的EcmaScript标准缺点
原生浏览器端还没有实现该标准全新的命令,新版的Node JS才支持实现
Babel大家期望的模块 系统可以兼容多种模块风格, 尽量可以利用已有的代码, 不仅仅只是JavaScript模块化, 还有CSS、图片、字体等资源也需要模块化。
WebPack是一款模块加载器兼打包工具, 它能把各种资源, 如JS、JSX、ES 6、SASS、LESS、图片等都作为模块来处理和使用。 安装:
npm install webpack -g//慢的话就用cnpm install webpack -g npm install webpack-cli -g//慢的话就用cnpm install webpack-cli -g测试安装成功
webpack -vwebpack-cli -v创建 webpack.config.js配置文件
entry:入口文件, 指定Web Pack用哪个文件作为项目的入口output:输出, 指定WebPack把处理完成的文件放置到指定路径module:模块, 用于处理各种类型的文件plugins:插件, 如:热更新、代码重用等resolve:设置路径指向watch:监听, 用于设置文件改动后直接打包 module.exports = { entry:"", output:{ path:"", filename:"" }, module:{ loaders:[ {test:/\.js$/,;\loade:""} ] }, plugins:{}, resolve:{}, watch:true }直接运行webpack命令打包
说明
# 参数--watch 用于监听变化 webpack --watch 当改变了其中JS的代码,会自动重新打包。