task46 初识webpack

webpack官网到底是哪个???
https://webpack.docschina.org/
https://www.webpackjs.com/

webpack:从入门到真实项目配置
git地址


工程化是什么鬼?


工程化

一、自动化


什么是自动化?
优化resume项目

1. sass和scss(优化css)

//全局安装node-sass
npm install node-sass -g
//用node-sass把scss转成css格式
node-sass main.scss main.css

如果安装失败就去google "node sass 安装失败"


node sass的命令行接口

sass和scss的区别???
这个是ruby社区的人发明的,一开始发明的是sass,语法很简洁(没有{}),前端说看不懂,然后ruby社区就再发明了scss给前端用(有{}),sass自己用。

  • scss可以识别css的语法,把.css文件改成.scss文件不会报错
  • scss可以使用一些css不支持的语法(如层级嵌套),scss文件需要使用工具转化成css文件浏览器才能识别
  • 安装node-sass,用命令行node-sass main.scss main.css可以手动把scss文件转成css文件

这样我们就可以写scss文件啦,但是浏览器不能识别scss文件,需要把scss转换成css才可以
但每次改动一下scss文件,都要用命令行转换成css才能生效,这样太不方便了,能不能自动转换呢??
——可以,使用命令node-sass main.scss main.css -w

在命令行监听scss变化自动转css

改了main.scss后保存,main.css也会跟着改变,页面就会生效

2. babel(优化js)

ES6的语法如let在Chrome上可以用,但一些旧版本的IE上会报错。怎么办呢?有没有什么工具可以帮忙将ES6等新代码转成ie也可以识别的代码呢?
——babel
https://babeljs.io/setup#installation

安装babel(看最新版的文档,现在的版本和之前不一样了,安装方法也有区别)

Babel 可以让你使用 ES2015/16/17 写代码而不用顾忌浏览器的问题,Babel 可以帮你转换代码。首先安装必要的几个 Babel 库
npm i --save-dev babel-loader babel-core babel-preset-env
先介绍下我们安装的三个库:
babel-loader 用于让 webpack 知道如何运行 babel
babel-core 可以看做编译器,这个库知道如何解析代码
babel-preset-env 这个库可以根据环境的不同转换代码
(引用自https://zhuanlan.zhihu.com/p/30701816

全局安装和项目安装有什么区别?

全局安装

全局安装的位置

项目安装

项目安装在了node_moudles路径

全局安装的位置在$PATH中

将src目录下的js文件都用babel转一下放到lib目录下

将src目录下的js文件都用babel转一下放到dist目录下
  • 现在babel遇到了和写sass一样的问题,修改了js文件后需要用命令行手动转,能不能自动转呢?
babel自动监听js文件改动

现在就需要开两个命令行窗口,一个监听scss文件改动然后自动转换,一个监听js文件改动然后自动转换

  • 代码目录结构比较乱


    目录结构混乱
  • 那么有没有什么比较规范的目录结构呢?
推荐的目录结构
  • 将css,js,html,img等都挪到src目录中
将html,js,css等文件都挪到src目录

修改后的目录结构

改成新的目录结构后,页面混乱了,那些js,css引用都会有点问题,怎么办呢?
之前的那些监听需要重新写input和output

  • 使用node-sass监听css目录下的scss文件变化并翻译成css文件(-o目录 -w监听)输出
node-sass监听src目录下的scss文件并翻译成css后输出到dist目录下
  • 使用babel翻译js文件
babel监听src/js目录下的js文件并翻译后输出到dist/js目录下

3. 自动监听html文件和img的变化并copy

现在有个问题,dist目录下只有css和js,没有html

dist

那么有没有命令可以监听html改动并自动copy到dist目录下呢
——watch命令 https://github.com/doowb/watch-cli

  • 还要再开窗口
  • 监听index.html文件变化了就把index.html从src目录拷贝到dist目录
  • 监听img目录图片变化了就把img目录下的图片从src目录拷贝到dist目录

使用watch命令:监听到src/index.html文件改变了,就执行后面的命令cp src/index.html dist/index.html(把src目录下的index.html复制到dist目录下)

使用watch命令:监听到src/index.html文件改变

监听图片目录img

(使用resume-15-5改成resume-15-9,自己改下试试)!!!

git

git remote set-url origin git@xxxxxxx
再加个需求,每次改动css或js文件给引用的地方自动更新下版本号,解决缓存更新相关的问题

现在这样,每次写代码的时候都要开好多个命令行窗口,不够智能,能不能不用这么多呢?5个窗口一个命令完成,什么工具呢?
Grunt(过时了不用了)
Gulp(过时了不用了)
webpack

二、用webpack来代替这些命令行


前端语言多,需要的命令行多

1. webpack安装配置

https://github.com/webpack/webpack
安装webpack:
npm install --save-dev webpack

image.png

Get Started
https://webpack.docschina.org/guides/getting-started

找到配置Configuration相关的


webpack.config.js
//webpack.config.js
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

新增并编辑webpack.config.js后,在命令行运行npx webpack

image.png

可以这样说,执行 npx webpack,会将我们的脚本 src/index.js 作为 入口起点,也会生成 dist/bundle.js 作为 输出。Node 8.2/npm 5.2.0 以上版本提供的 npx 命令,可以运行在开始安装的 webpack package 中的 webpack 二进制文件(即 ./node_modules/.bin/webpack
npx webpack帮你去找本地目录的webpack

2. webpack babel安装配置

google搜webpack babel github(webpack如何配置babel)

image.png

https://github.com/babel/babel-loader

  1. 安装:npm install -D babel-loader @babel/core @babel/preset-env webpack
    npm install -D:-D, --save-dev: Package will appear in your devDependencies.
  2. 配置webpack配置文件(webpack.config.js)
//webpack.config.js
module: {
  rules: [
    {
      test: /\.m?js$/,
      exclude: /(node_modules|bower_components)/,
      use: {
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env']
        }
      }
    }
  ]
}
  1. 安装好并修改好webpack配置文件后,再在命令行输入npx webpack就可以啦
    image.png
  • 在src/js/目录下创建3个文件(moudle-1.js、moudle-2.js、app.js)
//moudle-1.js
function fn(){console.log(1)}
export default fn
//moudle-2.js
function fn(){console.log(2)}
export default fn
//app.js
import x from './moudle-1.js'
import y from './moudle-2.js'
x()
console.log('webpack test')
y()
  • 修改下webpack配置文件↓
修改下webpack配置文件
  • 重新webpack一下,三个js都输出到一个bundle.js里面↓
重新webpack一下,三个js都输出到一个bundle.js里面

3. webpack scss安装配置

在src/css路径下新建个main.scss,用webpack怎么把这个scss文件转成css文件呢?

  • 搜webpack scss


    image.png

    (css)sass-loader (js)babel-loader

https://github.com/babel/babel-loader
https://github.com/webpack-contrib/sass-loader
https://webpack.docschina.org/loaders/sass-loader/

3.1 安装

npm install sass-loader node-sass webpack --save-dev
通过将 style-loadercss-loader 与 sass-loader 链式调用,可以立刻将样式作用在 DOM 元素
npm install style-loader css-loader --save-dev

3.2 修改webpack配置文件
// webpack.config.js
module.exports = {
    ...
    module: {
        rules: [{
            test: /\.scss$/,
            use: [
                "style-loader", // 将 JS 字符串生成为 style 节点
                "css-loader", // 将 CSS 转化成 CommonJS 模块
                "sass-loader" // 将 Sass 编译成 CSS,默认使用 Node Sass
            ]
        }]
    }
};

这时候运行npx webpack打包文件,发现没有加载css

没有加载css

3.3 在入口文件app.js中import css
//app.js
import x from './moudle1.js';
import y from './moudle2.js';
import '../css/main.scss'//引入css文件

再次npx webpack

webpack打包

//css文件:src/css/main.scss
body{
    background: pink;
    p{
        color:purple
    }
}
bundle.js中的css字符串
将scss转成css字符串添加到页面的style标签中

webpack帮你把css变成字符串,存储在bundle.js中,当页面运行的时候添加到页面的style标签中,等js执行了才加载css

use: [
 "style-loader", // 将 JS 字符串生成为 style 节点
 "css-loader", // 将 CSS 转化成 CommonJS 模块
 "sass-loader" // 将 Sass 编译成 CSS,默认使用 Node Sass
]

从下到上:

  • step1:sass-loader将sass/scss文件转化成css
  • step2:css-loader将 CSS 转化成 CommonJS 模块
  • step3:style-loader将 JS 字符串生成为 style 节点

现在我们可以把scss转成css了,并且添加到页面的style标签中

4. webpack一些其他的配置(如autoprefixer)

再加一些配置
比如说display:flex是有兼容性问题的,https://caniuse.com

image.png

怎么解决这些css在不同浏览器的兼容性问题呢?

  • 一种方法是coding时手动加前缀(IE加前缀)
image.png

那么我们想把autoprefixer加到webpack的配置中,怎么加呢?
google搜webpack autoprefixer
https://github.com/postcss/autoprefixer#webpack

image.png

不用autoprefixer-loader而是用postcss-loader!!!
https://github.com/postcss/postcss-loader

4.1 安装

npm i -D postcss-loader

4.2 配置

新增postcss配置文件:postcss.config.js

//postcss.config.js
module.exports = {
  parser: 'sugarss',
  plugins: {
    'postcss-import': {},
    'postcss-preset-env': {},
    'cssnano': {}
  }
}

修改webpack配置文件

//webpack.config.js
module.exports = {
  module: {
  //...
    rules: [
      {
        test: /\.css$/,
        use: [ 'style-loader', 'postcss-loader' ]
      }
    ]
  }
}

安装配置好了后运行npx webpack,报错Error: Loading PostCSS Plugin failed: Cannot find module 'postcss-import'

报错

找不到postcss-import就安装它: npm i -D postcss-import
同样的,也安装其他的postcss的插件(Plugin)和parser
npm i -D postcss-preset-env
npm i -D cssnano
npm i -D sugarss

image.png

image.png

parcel


webpack的理解

webpack打包速度慢的原因

https://zh.parceljs.org/

按照快速开始照着做一遍,就可以了

课后习题


使用 webpack
用 babel-loader 把 ES6 转译为 ES5
用 sass-loader 把 SCSS 转译为 CSS

同学答案
我的答案

https://github.com/FrankFang/webpack-demo-1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,419评论 1 32
  • 目录第1章 webpack简介 11.1 webpack是什么? 11.2 官网地址 21.3 为什么使用 web...
    lemonzoey阅读 1,730评论 0 1
  • 2017年12月7日更新,添加了clean-webpack-plugin,babel-env-preset,添加本...
    ZombieBrandg阅读 1,159评论 0 19
  • 工程化,简单来说就是使小作坊生产变成流水线生产,实现自动化、模块化、性能优化等。 自动化可以通过命令行来实现。 实...
    是刘快啊阅读 325评论 0 1
  • 这是一张剑网3在内测之前的演算效果截图,此情此景并不陌生。 2017年12月29日,剑网3翻开新的篇章到了重制版,...
    法兰城废墟阅读 270评论 1 1