webpack学习笔记-web工程化(1)
现代意义上的web工程化,包括模块化,组件化,自动化,规范化。在项目的启动之前,我们做好这一系列的工程化,那么项目的最终的质量会很高的。
首先说一下模块化,模块化就是将一个大小拆分程相互依赖的小文件,在进行统一的拼装和加载,这样的话,方便了多人合作开发,提高了项目代码的可读性、可扩展性。
JavaScript 模块化大概分为以下几个:
1、无模块化
2、CommonJS 规范(CJS规范,适用于服务端)
通过 require() 加载需要的模块, 这个方法是一个全局的方法,通过 exports / module.exports 导出要暴露的接口。
3、 AMD规范
AMD规范是异步加载的,模块的加载都不影响后边的语句执行,所有一来这个模块的语句,都定义在一个回调函数中。
AMD规范中,定义了两个 API: require([module], callback) 、 define(id, [depends], callback),通过 define 定义一个模块,通过 require 加载一个模块。
使用 require.js 的时候必须提前加载完所有的模块,然后才可以使用,这样的话,他的一个缺点就暴露出来了。那就是 ‘ 不能按需加载,如果模块过多,加载等待时间会很长 ’。
4、CMD规范
实现此规范的是 sea.js ,和 require.js 相似,每个 js 文件都是一个模块,它比 AMD 的优点在于,它能够按需加载,不过对于浏览器端来说,有可能会造成小小的延迟。因为你是在需要的时候在进行加载的,所以在等待加载的这个过程,会有一定的延迟的。这一点是不同于 AMD 的。
说白了就是, AMD 会提前加载模块,CMD 会延迟加载模块。
5、ES6模块化
ES6 的模块化是真正的规范,ES6 中我们可以通过 export 导出模块,通过 import 引入模块。由于现在浏览器对模块的支持度问题,所以大部分使用 babelJS 或者 Traceur 将 ES6 代码转化为兼容 ES5 版本的 js代码。
我还是比较推崇使用 ES6 的语法进行代码的编写,加载模块的时候,每个模块只加载一次,第二次使用的时候,会从内存中直接读取,这样就优化了很多。每一个模块内声明的变量都是局部变量,不会污染全局作用域。一个模块也可以导入多个模块。
概念性的如上,下面分享个构建工具叫webpack,
概念
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。可以从这里了解更多关于 JavaScript 模块和 webpack 模块的信息。
从 webpack v4.0.0 开始,可以不用引入一个配置文件。然而,webpack 仍然还是高度可配置的。在开始前你需要先理解四个核心概念:
- 入口(entry)
- 输出(output)
- loader
- 插件(plugins)
入口(entry)
入口起点(entry point)指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。
每个依赖项随即被处理,最后输出到称之为 bundles 的文件中,我们将在下一章节详细讨论这个过程。
可以通过在 webpack 配置中配置 entry
属性,来指定一个入口起点(或多个入口起点)。默认值为 ./src
。
接下来我们看一个 entry
配置的最简单例子:
webpack.config.js
module.exports = {
entry: './path/to/my/entry/file.js'
};
出口(output)
output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist
。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你可以通过在配置中指定一个 output
字段,来配置这些处理过程:
webpack.config.js
const path = require('path');
module.exports = {
entry: './path/to/my/entry/file.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'my-first-webpack.bundle.js'
}
};
在上面的示例中,我们通过 output.filename
和 output.path
属性,来告诉 webpack bundle 的名称,以及我们想要 bundle 生成(emit)到哪里。可能你想要了解在代码最上面导入的 path 模块是什么,它是一个 Node.js 核心模块,用于操作文件路径。你可能会发现术语生成(emitted 或 emit)贯穿了我们整个文档和插件 API。它是“生产(produced)”或“释放(discharged)”的特殊术语。output
属性还有更多可配置的特性,如果你想要了解更多关于 output
属性的概念,你可以通过阅读概念章节来了解更多。
loader
loader 让 webpack 能够去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以将所有类型的文件转换为 webpack 能够处理的有效模块,然后你就可以利用 webpack 的打包能力,对它们进行处理。
本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。注意,loader 能够 import
导入任何类型的模块(例如 .css
文件),这是 webpack 特有的功能,其他打包程序或任务执行器的可能并不支持。我们认为这种语言扩展是有很必要的,因为这可以使开发人员创建出更准确的依赖关系图。
在更高层面,在 webpack 的配置中 loader 有两个目标:
test
属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。use
属性,表示进行转换时,应该使用哪个 loader。
webpack.config.js
const path = require('path');
const config = {
output: {
filename: 'my-first-webpack.bundle.js'
},
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
}
};
module.exports = config;
以上配置中,对一个单独的 module 对象定义了 rules
属性,里面包含两个必须属性:test
和 use
。这告诉 webpack 编译器(compiler) 如下信息:
“嘿,webpack 编译器,当你碰到「在
require()
/import
语句中被解析为 ‘.txt’ 的路径」时,在你对它打包之前,先使用raw-loader
转换一下。”
重要的是要记得,在 webpack 配置中定义 loader 时,要定义在 module.rules
中,而不是 rules
。然而,在定义错误时 webpack 会给出严重的警告。为了使你受益于此,如果没有按照正确方式去做,webpack 会“给出严重的警告”
loader 还有更多我们尚未提到的具体配置属性。
插件(plugins)
loader 被用于转换某些类型的模块,而插件则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。
想要使用一个插件,你只需要 require()
它,然后把它添加到 plugins
数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new
操作符来创建它的一个实例。
webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin'); // 通过 npm 安装
const webpack = require('webpack'); // 用于访问内置插件
const config = {
module: {
rules: [
{ test: /\.txt$/, use: 'raw-loader' }
]
},
plugins: [
new HtmlWebpackPlugin({template: './src/index.html'})
]
};
module.exports = config;
webpack 提供许多开箱可用的插件!查阅我们的插件列表获取更多信息。
在 webpack 配置中使用插件是简单直接的,然而也有很多值得我们进一步探讨的用例。
模式
通过选择 development
或 production
之中的一个,来设置 mode
参数,你可以启用相应模式下的 webpack 内置的优化
module.exports = {
mode: 'production'
};
medicamento priligy estudios clinicos and Mirick, D
Snasdxxxax.Snasdxxxax
Prevent Gynecomastia Nolvadex tamoxifen citrate is a medication that is used to prevent gynecomastia or the development of enlarged breasts in men free samples of priligy
Contraindication Acute heart failure, ACS buy priligy usa
Interestingly, GR mediated redistribution of ER binding is not dependent on ER DNA binding capacity how to buy cheap cytotec without prescription