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

2019-11-30  本文已影响0人  洛音轩

1.讲了什么

2.做了什么

3.今日心得体会

4.明天要做什么

工作日志

(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.跨域资源共享(CORS)
//指定允许其他域名访问
'Access-Control-Allow-Origin:*'//或指定域
//响应类型
'Access-Control-Allow-Methods:GET,POST'
//响应头设置
'Access-Control-Allow-Headers:x-requested-with,content-type
2.通过jsonp跨域
3.通过修改document.domain来跨子域
4.使用window.name来进行跨域
5.使用HTML5的window.postMessage方法跨域
6.通过WebSocket进行跨域
7.图像ping(单向)
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.使用片段识别符来进行跨域

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配置,希望在后面的学习中,尽快完善自己的知识体系。
上一篇 下一篇

猜你喜欢

热点阅读