webpack 是一个现JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会分析你的项目结构,递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块按照指定的规则打包成一个或多个 bundle,过程中可以通过配置把一些浏览器不能直接运行的拓展语言(scss,typescript等)转换为合适的格式。

webpack处理模块化js

webpack 用于编译 JavaScript 模块。一旦完成安装,你就可以通过 webpack 的 CLI 或 API 与其配合交互。

准备工作

新建demo文件夹,npm init初始化项目, 局部安装webpack。

项目的基本结构

通常会在项目的根目录建立两个文件夹,分别为src文件夹和dist(或build)文件夹

  • src文件夹:用来存放我们编写的javascript代码,可以简单的理解为用JavaScript编写的模块。
  • dist文件夹:用来存放供浏览器读取的文件,这个是webpack打包成的文件。
使用webpack的基本文件
<!-- dist/index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Webpack Sample Project</title>
  </head>
  <body>
    <div id='root'>
    </div>
    <script src="bundle.js"></script>
  </body>
</html>
//  src/Greeter.js
module.exports = function() {
  var greet = document.createElement('div');
  greet.textContent = "Hi there and greetings!";
  return greet;
};
//  src/main.js 
const greeter = require('./Greeter.js');
document.querySelector("#root").appendChild(greeter());
使用webpack的方式

1.终端中使用

# {extry file}处填写入口文件的路径
# {destination for bundled file}处填写打包文件的存放路径
webpack {entry file} {destination for bundled file}

如果webpack不是全局安装的,那么当你在终端中使用此命令时,需要额外指定其在node_modules中的地址

# webpack非全局安装的情况
node_modules/.bin/webpack src/main.js dist/bundle.js

命令执行成功后,会在dist目录下出现bundle.js文件,index.html就可以在浏览器中预览结果了。

2.通过配置文件来使用Webpack

根目录下创建webpack.config.js, 配置entry、output,终端中使用时可以不用每次都手动添加。

const path = require('path');

module.exports = {
  entry:  __dirname + "/src/main.js", //已多次提及的唯一入口文件
  output: {
    path: __dirname + "/dist", //打包后的文件存放的地方
    filename: "bundle.js" //打包后输出文件的文件名
  }
}
webpack 或

webpack --config webpack.config.js

注:

  • “__dirname”是node.js中的一个全局变量,它指向当前执行脚本所在的目录。
  • 文件中path也可以这样写path: path.resolve(__dirname,'dist'), 注意需要引入‘path’, path.resolve(__dirname,'dist')获取了项目的绝对路径
  • 非全局需使用node_modules/.bin/webpack
  • 如果 webpack.config.js 存在,则 webpack 命令将默认选择使用它,终端命令可以不明确指出,如果命名为其他名字,需要--config xxx指明希望使用的配置文件。

3.npm 脚本

通常webpack推荐局部安装,因此在命令行中输入命令类似于node_modules/.bin/webpack这样的路径比较麻烦,可以在package.json中对scripts对象进行相关设置即可,设置方法如下

{
    ...
    "scripts": {
        "start": "webpack" // 修改的是这里,JSON文件不支持注释,引用时请清除
    },
    ...
}
为什么可以直接写webpack,而不需要写路径,详见webpack安装踩坑中关于npm 脚本原理的内容。

运行

npm run start 或

npm start

//除了几个默认的命令,如start等,run不可以省略。

webpack的基本使用就完成了……

其他方式处理相互依赖的js

1.使用古老的js引入方式去管理 JavaScript 项目
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Webpack Sample Project</title>
  </head>
  <body>
    <div id='root'>
    </div>
    <script src="greet.js"></script>
    <script src="main.js"></script>
  </body>
</html>
// greet.js
function greeter() {
  var greet = document.createElement('div');
  greet.textContent = "Hi there and greetings!";
  return greet;
};
// main.js
document.querySelector("#root").appendChild(greeter());

会有一些问题:

  • 无法立即体现,脚本的执行依赖于外部扩展库(external library)。
  • 如果依赖不存在,或者引入顺序错误,应用程序将无法正常运行。
  • 如果依赖被引入但是并没有使用,浏览器将被迫下载无用代码。
2.模块化方式
  • CMD规范的seaJS
  • AMD规范的requireJS
  • browserify
  • ES2015 中的 import 和 export 语句已经被标准化(大多数浏览器还无法支持它们)

mayihetu
107 声望3 粉丝

下一篇 »
ES6 解构赋值