JS进阶 -- 工程化之 webpack
代码链接
概述
工程化包括了自动化 + 模块化 + 性能优化,前端语言较多并且更新频率较快。
1 | CSS ==> Less ==> Sass ==> Scss ==> Stylus(结合Less + Sass) |
当我们面对这么多语言的时候,Webpack 应运而生,Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),它主要为我们解决了工程化的问题。在本篇文章中将要介绍 SCSS + babel + Webpack
Sass | Scss
Scss 是 CSS 的预处理语言 | 扩展,Sass makes CSS fun again
这是Scss 要做的事情。Scss添加了嵌套规则、变量、混入、选择器继承,还能和命令行工具 | Web框架插件将其转换为格式良好的标准 CSS
Sass 与 Scss 区别
Sass 使用换行 + 缩进进行工作
1 | body |
Scss 使用分号 + 花括号进行工作
1 | body{ |
安装 Scss
Scss 是有 Ruby 社区创作出来的,所以要使用 gem
命令,但是 node
将 Scss 重写了一遍,所以可以使用 node-sass
1 | npm install -g node-sass // 安装 |
安装成功之后便可以使用 node-sass 了
1 | node-sass [options] <input> [output] |
babel
Babel is a JavaScript compiler。它是一款可以将 JS 语法编译为 ES5(IE能读)的编译器
安装 + 使用
1 | npm install --save-dev babel-cli babel-preset-env |
watch
watch 命令行工具可以监控文件的改动
1 | npm i -g watch-cli |
watch 也可以用于 img
1 | watch -p 'src/img/**/*' -c 'cp -r src/img dist/img' |
前端目录规范
src ==> source 目录 ==> 未经翻译的代码
dist ==> distribution 目录 ==> 待发布的代码
node_modules ==> 第三方包
vendors ==> 第三方代码(jQuery)
Webpack
通过之前的介绍,我们使用
scss ==> node-sass ==> css
ES6 JS ==> babel ==> ES5(IE 使用)
HTML + img ==> watch ==> 复制
我们通过这么多的命令才能实现我们的自动化,那么为什么不使用一种工具,具有以上三者的作用呢,所以 Webpack 应运而生
Webpack 核心
入口(entry)
entry 指示 webpack 使用哪个模块来作为构建其内部依赖图的开始,进入进口后,webpack 会找出有哪些模块和库是入口直接或间接依赖的,每个依赖项随即被处理,最后输出到 bundles 的文件中
通过在 webpack 配置中配置 entry
属性来指定起点
1 | webpack.config.js |
出口(output)
output 属性告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件
1 | webpack.config.js |
loader
loader 让 webpack 能够去处理非 JavaScript 文件(webpack 自身只能理解 JavaScript)。webpack loader 将所有类型的文件,转换为应用程序的依赖图可以直接引用的模块。多数 loader 可以通过选项(options
)自定义
loader 实现的目标
- 识别出应该被对应的 loader 进行转换的那些文件(使用
text
属性) - 转换这些文件,使其能被添加到依赖图中(使用
use
属性)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23webpack.config.js
module.exports = {
entry: './path/to/my/entry/file.js',
output: {
path: path.resolve( __dirname, 'dist' )
filename: 'my-first-webpack-bundle.js'
},
module: {
rules: [
{
// 遇到匹配的文件,使用 loader 进行转换之后再进行打包
text: /\.txt$/, // 匹配的文件
use: 'raw-loader' // 使用的 loader
use: {
loader: 'babel-loader',
options: {
presets: [ '@babel/present-env' ]
}
}
}
]
}
}
插件(plugins)
loader 被用于转换某些类型的模块,而插件则用于执行范围更广的任务。插件的范围包括:从打包优化 + 压缩,一直到重新定义环境中的变量
想使用一个插件,需要 require()
插件,然后把它添加到 plugins
数组中,多数插件可以通过选项 options
自定义
1 | webpack.config.js |
webpack 使用
注意:npm i 找不到的module
1 | mkdir webpack-demo |
使用 babel-loder
1 | index.js + main.js |
模块化
1 | touch src/js/app.js |
使用 scss-loader
1 | npm install sass-loader node-sass webpack --save-dev |
使用 postcss-loader
postcss-loader 能够使得 CSS 自动添加前缀,从而使我们的代码更加强健
1 | npm i -D postcss-loader |
webpack 总结
- webpack 将前端思想完全转变,将 CSS 写入 JS 中,使用 JS 生成