webpack学习(2019/7/25-7/29)

1.讲了什么

  • es6小复习
  • 怎么用node读写文件?
  • 怎么用babel将es6语法转换为es5语法?
  • webpack和babel自己配置好
  • 布置了课堂作业和作业

2.做了什么

  • 解决了上述的问题
  • 完成了上述的作业

3.今日心得体会

  • webpack的配置因为版本兼容性问题,导致配置的时候,官网的文档有些bug,有点看不懂,整的挺崩溃的

4.明天要做什么

  • 继续webpack的配置学习
    作业(课堂作业,加作业),工作日志(讲什么,做什么,今日心得,遇到什么问题,明天要做什么),

工作日志

(2019.7.26)

课堂作业

1.输出文件带有哈希值

module.exports = {
    entry: {
        "main": './src/index.js',//入口文件
    },
    output: {
        filename: '[name].[hash].js',//[hash]配置好以后,自动生成
        path: path.resolve(__dirname, 'dist')//__dirname为当前的目录的绝对路径
    },
}

配置output的filename属性,让其输出文件名加上‘[hash]’即可

2.把js,css动态引入html中

var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
    entry: {
        "main": './src/index.js',
    },
    output: {
        filename: '[name].[hash].js',
        path: path.resolve(__dirname, 'dist')
    },
    plugins: [
        new HtmlWebpackPlugin({}),
    ]
}

配置html-webpack-plugin即可动态生成html文件,并把生产的js,css文件以创建的script动态引入

3.less和sass自动编译

module.exports = {
    entry: {
        "main": './src/index.js',
    },
    output: {
        filename: '[name].[hash].js',
        path: path.resolve(__dirname, 'dist')
    },
    module: {
        rules: [{
            test: /\.less$/,
            use: [
                'style-loader',
                'css-loader',
                'less-loader'
            ]
        }, {
            test: /\.scss$/,
            use: [
                'style-loader',
                'css-loader',
                'sass-loader'
            ]
        }]
    },
}

webpack本身只能打包js文件,但浏览器要加载的除js外,有css、less和图片等文件,所以就引入了loader来编译,style-loader用来将生产的js文件插入以script的方式加入到生成的html文件中,css-loader为了解析css,sass-loader将sass文件编译成css文件

4.css抽取

const MiniCssPlugin = require("mini-css-extract-plugin");
module.exports = {
    entry: {
        "main": './src/index.js',
    },
    output: {
        filename: '[name].[hash].js',
        path: path.resolve(__dirname, 'dist')
    },
    plugins: [
        new MiniCssPlugin({
            filename: '[name].css',
        })
    ]
}

将css单独提取不编译成js文件,需要mini-css-extract-plugin插件,配置如上

5.实现js压缩

const uglify = require('uglifyjs-webpack-plugin');
module.exports = {
    entry: {
        "main": './src/index.js',
    },
    output: {
        filename: '[name].[hash].js',
        path: path.resolve(__dirname, 'dist')
    },
    plugins: [
        new uglify(),
    ]
}

讲了什么?

1.介绍了很多插件

1.文件复制插件:把编译好的文件输出到相应目录下,copy-webpack-plugin
2.清除无关紧要的东西:clean-webpack-plugin
3.webpack热替换
4.webpack.DefinePlugin
5.Manifest
6.IgnorePlugin
7.mini-css-extract-plugin
8.optimize-css-assets-webpack-plugin
9.css module(不太懂)
10.sourceMap
11.代码拆分
12.抽取公共组件
13.webpack dll

2.了解跨域,写工作日志

1.什么是跨域?

在了解跨域之前,首先要知道什么是同源策略(same-origin policy)。简单来讲同源策略就是浏览器为了保证用户信息的安全,防止恶意的网站窃取数据,禁止不同域之间的JS进行交互。对于浏览器而言只要域名、协议、端口其中一个不同就会引发同源策略,从而限制他们之间如下的交互行为:

  • 1.Cookie、LocalStorage和IndexDB无法读取;
  • 2.DOM无法获得;
  • 3.AJAX请求不能发送。
  • 特别注意两点:
  • 第一,如果是协议和端口造成的跨域问题“前台”是无能为力的
  • 第二:在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上
  • “URL的首部”指window.location.protocol +window.location.host,也可以理解为“Domains, protocols and ports must match”。

二、为什么浏览器要限制跨域访问呢?

  • 如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题

三、为什么要跨域?

  • 既然有安全问题,那为什么又要跨域呢? 有时公司内部有多个不同的子域,比如一个是location.company.com ,而应用是放在app.company.com , 这时想从 app.company.com去访问 location.company.com 的资源就属于跨域

四、解决跨域问题的方法:

1.跨域资源共享(CORS)
  • CORS(Cross-Origin Resource Sharing)跨域资源共享,定义了必须在访问跨域资源时,浏览器与服务器应该如何沟通。CORS背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。
  • 服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。
    只需要在后台中加上响应头来允许域请求!在被请求的Response header中加入以下设置,就可以实现跨域访问了!
  • 如下所示:
//指定允许其他域名访问
'Access-Control-Allow-Origin:*'//或指定域
//响应类型
'Access-Control-Allow-Methods:GET,POST'
//响应头设置
'Access-Control-Allow-Headers:x-requested-with,content-type
2.通过jsonp跨域
  • JSONP是JSON with Padding(填充式json)的简写,是应用JSON的一种新方法,只不过是被包含在函数调用中的JSON
    callback({"name","trigkit4"});
  • JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据
  • JSONP的原理:通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入,所以jsonp是需要服务器端的页面进行相应的配合的。(即用JavaScript动态加载一个script文件,同时定义一个callback函数给script执行而已。)
  • JSONP的优缺点:
  • JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。
  • JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
  • CORS和JSONP对比:
  • CORS与JSONP相比,无疑更为先进、方便和可靠。
    • (1)JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求;
    • (2)使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得说句,比起JSONP有更好的错误处理;
    • (3)JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS;
3.通过修改document.domain来跨子域
  • 两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享 Cookie或者处理iframe
  • 比如A网页是http://w1.example.com/a.html,B网页是http://w2.example.com/b.html,那么只要设置相同的document.domain,两个网页就可以共享Cookie
4.使用window.name来进行跨域
  • window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它
5.使用HTML5的window.postMessage方法跨域
  • HTML5为了解决这个问题,引入了一个全新的API:跨文档通信 API(Cross-document messaging)。
    这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源
6.通过WebSocket进行跨域
  • web sockets是一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信
  • web sockets原理:在js创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议
7.图像ping(单向)
  • 什么是图像ping: 图像ping是与服务器进行简单、单向的跨域通信的一种方式,请求的数据是通过查询字符串的形式发送的,而相应可以是任意内容,但通常是像素图或204相应(No Content)。 图像ping有两个主要缺点:首先就是只能发送get请求,其次就是无法访问服务器的响应文本
  • 使用方法
var img = new Image();
img.onload = img.onerror = function(){
alert("done!");
};
img.src = "https://raw.githubusercontent.com/zhangmengxue/Todo-List/master/me.jpg";
document.body.insertBefore(img,document.body.firstChild);
8.使用片段识别符来进行跨域
  • 片段标识符(fragment identifier)指的是,URL的#号后面的部分
  • 如果只是改变片段标识符,页面不会重新刷新。
    父窗口可以把信息,写入子窗口的片段标识符
  • 子窗口通过监听hashchange事件得到通知

3.webpack的价值

webpack是前端工程师的价值体现,也是工程化概念

做了什么?

完成的上述的部分任务,按照发的文档将dev-demo下载,调试能运行,看了部分的react基本操作

今日心得

遇到了哪些问题,怎么解决的
本来打算用react配置大作业,结果是时间不够,最后只是大概了解了一下react的语法,遇到的问题有很多,好些插件在官网上只是提了一下,并没有具体的使用实例,最后只能边看边查其他的网站资料。

明天要做什么?

继续webpack学习
作业(课堂作业,加作业),工作日志(讲什么,做什么,今日心得,遇到什么问题,明天要做什么)

作业:配置在项目中配置webpack

工作日志

今天主要进行大作业的配置

今日心得

  1. 今天在具体的项目上进行了webpack配置,实现了html,css,js的压缩,less,sass的编译,css的抽离,img的src路径的自动配置,background中url路径的base64转码
  2. 通过对各种插件和loader的配置使用,更加熟悉了webpack的功能实现
  3. 在配置的过程中遇到了各种各样的问题,去查找问题,解决问题,锻炼了资源查找的能力

遇到的问题

  1. background: url(./../img/mi-logo.png) no-repeat 50% 50%;和img src属性路径不能打包输出问题
    解决方法:首先安装html-withimg-loader插件来解读html中img的src属性对应的url地址,
{
    test:/\.html$/,
    use:"html-withimg-loader"
}

用url-loader将src对应的图片提取到./dist/img中

{
    test: /\.(jpg|png|jpeg|svg|ttf|woff)$/,
    use: [{
        loader: 'url-loader',
        options: {
            // name: '[name].[ext]',
            outputPath: './img',
            // publicPath: '/img'
            limit:1000*1024,
        }
    }]
}

而然对于background-image中的图片可以通过url-loader转成base64格式,

转换前:
background: url(./../img/mi-logo.png) no-repeat 50% 50%;
转换后:
background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADEAAAAxCAYAAABznEEcAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Q0VDMUQzNzk0NEU4MTFFNzk2MkVGMzkwQUQ3RjNGMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6Q0VDMUQzN0E0NEU4MTFFNzk2MkVGMzkwQUQ3RjNGMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDRUMxRDM3NzQ0RTgxMUU3OTYyRUYzOTBBRDdGM0YyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDRUMxRDM3ODQ0RTgxMUU3OTYyRUYzOTBBRDdGM0YyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoQEikwAAAEASURBVHja7JkxCsIwFIZbraCTirsOeoGO4gU8hRdw9AxuLl7AA+juAQRXL2BR8ARulSrGX8ggIa2ljYTI/+Ab+pK88JU0aakvhPBcj4r3B0EJSlCCEpSgBCUoQQlKaCMGogQJiMACdFLm2ChjYtMS9ZI3qwb6YAYOYKDp0yg6p43l1AVrk3PbeiZCMDZVLCg4bg8mOfpVwRAsQUtpG4GtTYkrOOXse5QyKyXfdm057X5ZPDBUp6nZOs9yq3zH3QWJOZgquR64uHRiWz35+e5ECUpQghKUMCFx03zpZbU/wePjOpG5rBrfaqaGzz9FlKAEJShBCUpQghKUoISNeAkwAAteNgN0VYtEAAAAAElFTkSuQmCC) no-repeat 50% 50%
  1. 如果直接给css添加兼容性前缀,直接使用postcss-loader是不行的,
//使用postcss-loader

use: ["css-loader","postcss-loader"]
创建postcss.config.js,加入如下代码:
module.exports = {//css加前缀
    plugins: [
        require('autoprefixer')
    ]
}

还需要

//创建.browserslistrc文件,写上
>1%
last 2 versions
not ie <= 8
  1. 打包输出html文件,使用HtmlWebpackPlugin插件
new HtmlWebpackPlugin({ // 打包输出HTML
    title: 'Hello World app',
    minify: { // 压缩HTML文件
        removeComments: true, // 移除HTML中的注释
        collapseWhitespace: true, // 删除空白符与换行符
        minifyCSS: true// 压缩内联css
    },
    filename: 'index.html',
    template: './src/index.html',
    inject:true
}),
  1. 对react框架很不熟悉,本来打算重新写一个react项目来联系webpack的配置,但是实际学习的过程中效率很低,所以最后选用了一个之前做过的项目来练习webpack配置,希望在后面的学习中,尽快完善自己的知识体系。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容