使用SASS、Babel命令行
- 工程化:我们需要对之前没有任何分工的代码进行自动化,模块化以及性能优化
- 我们之前写CSS的时候,使用的是CSS,能不能直接使用SASS?
- SASS又叫SCSS,是一种更厉害的CSS编写方式
- SASS是Ruby社区发明的语言
- 安装:
- 安装的时候使用全局安装:npm i -g node-sass
- 安装结束,可以查看版本看看是否安装成功:node-sass -v
- SCSS的使用方式
- 直接将文件中的main.css改成main.scss:mv main.css main.scss
- SCSS是完全兼容CSS语法的。只是在CSS的基础之上增加一些更高级的语法
- 使用的方式直接跟着抄就好了
- 我们将SCSS文件翻译成CSS文件:node-sass scss文件名 css文件名
- 此时两个文件没有多大区别
- SCSS语法使用1
- 嵌套规则:选择器可以嵌套到大括号里面使用
- 我们再次运行翻译文件,会将原先省略的部分全部添上,即便还是有缩进,但其实分成了一个一个独立的块
- 为什么又有SASS又有SCSS?
- 本来Ruby社区发明的SASS相当简洁
- 但是前端说看不懂,非得添加上括号,于是Ruby在SASS的基础上发明了SCSS
- 嵌套规则:选择器可以嵌套到大括号里面使用
- HTML中引用的只能是纯CSS文件
-
我们发现我们每次写一句话都非常麻烦,需要将SCSS文件转成CSS文件,否则没有效果,我们想着能不能自动翻译,这里我们需要使用-w
-
我们使用:node-scss main.scss main.css -w main.scss,来监听main.scss,一旦这个文件发生变化(文件的变化方式甚至可以使用echo命令行来实现),就执行前面的文件,这个就是一个自动化的过程,不用等我们去转换,自动转换
- SASS的第一个门槛是命令行
- Babel:将ES6语法转换成ES5语法,比如IE不支持let语法,可以使用Babel,是一种命令行,https://babeljs.io/
-
运行安装之前,需要运行npm init,这个用于创建合法的package.json
- 安装操作的网址在:https://babeljs.io/en/setup/#installation,选择CIL(命令行)
-
当我们运行npm,其实就是运行上面的build里面的babel src -d lib
- 我们为什么运行会出错呢?因为babel是局部安装,我们安装到的是./node_modules/.bin/babel
-
我们需要这么运行,./node_modules/.bin/babel src -d lib,这句话的意思就是将src里面的js全部翻译成IE可以使用的JS,放入-d后面这个目录中,通常这个目录我们使用dist
- 全局安装与项目安装的区别
- npm install -g http-server:属于全局安装,安装之后就可以在任意文件夹中使用这个http-server,因为安装到全局目录下了,这个全局目录包含在在PATH里面
- npm install http-server:属于局部安装,只能在当前目录使用,安装在当前目录下,使用的时候要加上具体路径
- 我们碰到一个跟写SCSS一样的问题,就是当用户更改JS文件之后,能否进行自动转换呢?加一个--watch就好了
- 使用命令行:./node_modules/.bin/babel js -d dist --watch
使用更多命令行
- 我们的代码分成四个部分
- src,全称source,存放未经翻译的代码
- dist,全称distribution,存放发布代码
- vendors,全称vendors,存放第三方代码
- node_modules,第三方代码,放nodejs
- 工程化这个事情完全是用命令行来做的
- 我们发现所有的src都要拷到dist里面去
-
我们可以监听index.html的,如果index.html发生变化就将index.html拷贝到dist里面去
-
我们最终需要使用命令行开启三个监听,node-sass监听CSS变化,babel监听JS变化,watch监听index.html的变化和img图片的变化
- 总结:
- 有的人喜欢写的CSS和JS版本不一样,我们可以通过翻译工具,翻译成一种
-
缓存,假设我们发布了一个网页,需要在每一个CSS后面加一个?v=1这样的标识,因为我们的CSS做了很长时间的缓存;一旦我们改了这个CSS,我们希望这个端口号可以更改,以便客户端更新缓存。前端在nodejs诞生之后想了各种方法来代替我们开的那几个监听窗口;一开始的工具叫做Grunt,后来Gulp替代了Grunt(比较快),后来webpack替代了Gulp。就是将命令行工具统一成一个工具。
用webpack来代替这些命令行
-
前端为什么需要这么多工具呢?
- 前端的语言比较多,CSS/JS/Html/img/svg等,语言多。
- 第二个原因是变化快:CSS-Less-SASS-SCSS,后来又出现Stylus(兼容less和sass)
这种情况下webpack出现了:https://github.com/webpack/webpack
我们在使用webpack之前需要将package.json回归初始状态,可以删掉,然后npm -y init
运行安装webpack:npm install webpack webpack-cli --save-dev
-
安装成功之后,package.json就会出现一个依赖库,然后node_modules/.bin/下面就会有一个webpack
-
我们照着操作,然后创建配置文件,我们猜测这个的意思就是将src中的index.js文件加工输出到dist中的main.js
写好这个配置文件之后,我们运行一下这个webpack,但是每次都带上目录好麻烦,使用简写:npx webpack,npx就是用来找本地目录的webpack
-
运行之后,我们发现dist目录下出现了main.js,并且里面添加了很多js语法,说明webpack将一些语法放到这个文件里面了
原先的代码还在里面,新添加的那些代码就是为了在运行的之后,进行翻译
lodash可以了解下
在后台,webpack实际上是“转码”代码,以便较旧的浏览器也可以运行它。
-
所有的JS文件都写成模块化的状态,然后再入口JS那边导入并运行就好了
- 我们有一个index.js作为整个html的唯一引用的我们写的JS文件,其余JS文件全部封装成模块,导入到index.js文件中
- 有关export default function 和 export function 的区别
- 第一组是使用 export default 时,对应的 import 语句不需要使用大括号。
- 第二组是不使用 export default 时,对应的 import 语句需要使用大括号。
- export default命令用于指定模块的默认输出。
- 显然,一个模块只能有一个默认输出,因此export default命令只能使用一次。
- 所以,import命令后面才不用加大括号,因为只可能唯一对应export default命令。
-
我们需要有一个配置文件,指明每次需要进行转化的文件,下面这个文件的意思就是将./src/index.js作为入口文件,加工一下变成dist/bundle.js,然后我们在html中引入的就是这个bundle.js文件
const path = require('path'); module.exports = { entry: './src/index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }};
我们可以在webpack中使用sass将SCSS转换成css,使用babel将js进行转换。webpack中有很多插件,可以实现相关目标。安装的过程中,需要更改配置文件。
-
概念:
- Entry:是一个入口文件,用于构建转换的基础文件,一般会是一个JS文件,将其余JS文件以模块的形式导入到这个入口JS文件里面,JS文件中使用import导入的文件,可以是任何文件。导入任何类型的模块,例如.css文件是Webpack特有的功能,其他捆绑程序或任务运行程序可能不支持。入口文件可以多个,但是出口文件只能有一个
- Output:是指明经过加工的文件,放到哪里,叫什么名字。
- Loader:webpack只能理解JavaScript和JSON文件,而Loader可以转换其他文件,如将SCSS文件转成CSS(之前的SASS功能),ES6语法转ES5语法等(就是之前的Babel功能)。
- test:用于确定转换的文件格式
- use:指明执行转换的loader,不同的文件转换需要不同的loader
- 就相当于告诉webpack,当你碰到import或者require使用的txt文件的时候,请使用raw-loader进行转换,文件名称可以使用正则
- Plugins:插件可以执行比loader更广泛的任务,如捆绑优化,资产管理和环境变量注入。
- 使用plugins的时候,需要使用require将对应的plugin加入到plugins数组中
- Mode:模式,通过将mode参数设置为development,production或none,可以启用与每个环境相对应的webpack内置优化。,默认是produnction
- Browser Compatibility,浏览器兼容性,webpack支持所有的支持ES5的浏览器(IE8不支持)。webpack需要支持Promise语法。
这种时候试着去看看文档。
webpack支持通过加载程序以多种语言和预处理器编写的模块。加载程序向webpack描述了如何处理非JavaScript模块,并将这些依赖项包含在包中。
-
webpack社区已经为各种流行语言和语言处理器构建了loader,包括
- CoffeeScript
- TypeScript
- ESNext (Babel)
- Sass
- Less
- Stylus
- Elm
总体而言,webpack提供了一种功能强大且丰富的自定义API,该API允许一个人将webpack用于任何堆栈,而不必担心开发,测试和生产工作流程。
-
webpack是可以在js文件中导入CSS的
- 这可以支持可以将“ ./style.css”导入依赖于该样式的文件中
- 也就是现在我们不需要写style标签,只要引用文件就好了
- 我们打开dist里面的网页,看到样式变化了
-
webpack可以使用file-loader合并文件,如图片等,现在图片也是可以导入的,即import
- 上面的图片可以引入到JS中
- 还可以作为路径引入到html标签中,作为背景图片
- file-loader加载程序获取通过它们加载的任何文件,并将其输出到构建目录。这意味着我们可以将它们用于任何类型的文件,包括字体。
数据也可以被加载
可以了解一下d3
-
多个输入,多个输出,最终我们输出的文件有app.bundle.js以及print.bundle.js,这个name就是指entry内部各个键的名称
const path = require('path'); module.exports = { entry: { app: './src/index.js', print: './src/print.js' }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), }, };
HtmlWebpackPlugin默认会生成index.html文件,也就是如果存在这个文件,就会覆盖之前的文件,但是新生成的这个文件会将所有bundle后的文件引用到页面中
-
webpack跟踪被使用的文件,将未使用的文件自动清除,使用clean-webpack-plugin
webpack的开发模式,可以使用追错的devtool
可以实现自动编译,通常使用webpack-dev-server,这个插件实现了自动变异,以及网页自动刷新
webpack可以使用多个config文件,文件可以实现继承,使用导入以及...操作即可。