zoukankan      html  css  js  c++  java
  • [vue]webpack打包

    前端打包是什么概念呢?
    我们用webpack工具对js,css,甚至图片进行打包.

    es6的语法js模块化用法(仅支持chrome)

    按照py的逻辑,诸多的js被main.js调用,然后在html引入,就可以实现js的模块化开发,(互相的导入使用es6的语法), 谷歌浏览器可以识别es6,但是其他的浏览器就不怎么好使了.
    大概是以下的一个逻辑.es6的导入需要注意的几个问题

    - a.js
    export let a = "maotai";
    export let b = "maomao";
    
    - b.js
    export let b = "b.js";
    
    - main.js 将a和b引入
    import * as obj1 from "./a.js"
    console.log(obj1.a, obj1.b);
    
    import * as obj2 from "./b.js"
    console.log(obj2.b);
    
    - index.html,将main.js引入,引入的时候指定type. 谷歌浏览器支持,其他浏览器不一定支持. 后面需要转换成es5,(webpack和诸多插件会上场)
    <script src="main.js" type="module"></script>
    

    webpack基本使用(将js合成1个供html调用)

    为了支持更多的浏览器,我们需要es6转换为es5,使更通用.
    就需要用到webpack,

    组合js css 图片base化(一般低于8k的图), 处理css均为他的强项

    nodejs参数

    - npm run build调用逻辑
    1,先找到package.json里的配置build
    2,找到build对应的命令webpack, webpack会找./node_modules/./bin/webpack.cmd
    3,./node_modules/./bin/webpack.cmd会调用./node_modules/webpack/bin/webpack.js
    
    

    知道调用逻辑后,就可以心安理得的去配置玩一玩了.

    - 我用的是webpack3.x版本,现在4.x好像不太一样了
    npm init -y
    npm install --save-dev webpack@3.8.1
    
    webpack配置文件: webpack.config.js(需在执行命令的当前路径下有这个配置)
    
    
    
    package.json -- ./nodemodule/.bin/webpack.cmd -- ./nodemodule/webpack/bin/webpack.js
    npm run build
    
    1. package.json
      "scripts": {
        "build": "webpack", //找到第二步
      },
      
    2.查找熟悉路径
    .
    ode_modules.binwebpack.cmd //找到  .
    ode_moduleswebpackinwebpack.js
    
    执行.
    ode_moduleswebpackinwebpack.js时需要在执行目录下有webpack.config.js
    
    - webpack.config.js
    1,创建src/main.js src下与main相关的js
    2,main.js是入口文件
    3,webpack.config里指定入口main.js即可.
    
    let path = require('path');
    // console.log(path.resolve('./dist')); //绝对路径转相对路径
    module.exports = {
        entry: "./src/main.js",
        output: {
            path: path.resolve('./dist')  //这里要是绝对路径,./dist/bundle.js
            filename: 'bundle.js',        //将包打到bundle.js里
        }
    };
    
    - main.js
    let s1 = require('./a.js');
    console.log(s1);
    
    - a.js
    let s1 = "maomao3";
    module.exports = s1;
    
    - index.html
    <script src="dist/bundle.js"></script>
    

    babel转义es6到es5

    0, 支持

    1.es6的语法 import  //前端用import  js
    2,node语法  require //后端用require nodejs
    

    1.安装babel(es6转译es5)

    - 转译器
    - 转译器接口
    - 转译器接口插件es2015(es6)
    npm i --save-dev babel-core
    npm i --save-dev babel-loader
    npm i --save-dev babel-preset-es2015  //得到了很多文件夹,使得bable转译器接口识别es6语法
    npm i --save-dev webpack@3.12.0
    

    2.配置文件

    let path = require('path');
    // console.log(path.resolve('./dist')); //绝对路径转相对路径
    module.exports = {
        entry: "./src/main.js",
        output: {
            path: path.resolve('./dist')    //必须绝对路径,
            filename: 'bundle.js'
        },
        module: {
            rules: [
                // 1.匹配所有js 2,用bable-loader来转译(为es5), 3,排除node_modules目录下js
                {test: /.js$/, use: 'babel-loader', exclude: /node_modules/}
            ]
        }
    };
    

    3.babel-loader的配置文件.babelrc: 目的是加载插件

    $ cat .babelrc
    {
      "presets": ["es2015"] // 让翻译官拥有解析es6语法的能力.
                            // 对应babel-preset-es2015插件
    }
    
    查看bundle.js可以查看转义为es5的结果.
    

    babel转义es7到es5

    npm i --save-dev babel-preset-state-0 //包含stage1 2 3, 注: stage4是另外的
    
    $ cat .babelrc
    {
      "presets": ["es2015","stage-0"]
    }
    
    - main.js里添加es7语句测试
    let a = b => c => d => b + c + d;
    
    查看bundle.js可以查看转义为es5的结果.
    

    babel转义css和图片

    1.css-loader: 将css解析成模块
    2.style-loader: 将css解析的内容插入到style标签
    
    npm i --save-dev css-loader style-loader
    
    - 写index.css
    body {
        background-color: lavender;
    }
    
    - main.js引入
    import "./index.css"
    
    
    - 配置webpack.config.js
        module: {
            rules: [
                // 1.匹配所有js 2,用bable-loader来转译(为es5), 3,排除node_modules目录下js
                {test: /.js$/, use: 'babel-loader', exclude: /node_modules/},
                // 1.use是从右往左写 2,先经过css-loader,后经过style-loader
                {test: /.css$/, use: ['style-loader', 'css-loader'], exclude: /node_modules/}
            ]
        }
    - 构建
    npm run build
    
    - 查看背景色,发现被改
    样式被打到了bundle.js里了
    

    webpack解析less

    - 安装less解析器
    npm i --save-dev less less-loader
    
    - style.less
    html {
      body:after{
        content:'我爱你';
        color:red
      }
    }
    
    - main.js
    import './style.less';
    
    - webpack.config.js
    {test:/.less$/,use:['style-loader','css-loader','less-loader']},
    
    - 构建
    npm run build
    

    webpack解析图片

    - 安装
    npm install file-loader url-loader --save-dev
    
    - main.js
    // 在js中引入图片需要import,或者写一个线上路径
    import page from './2.jpg';
    console.log(page); // page就是打包后图片的路径
    let img = new Image();
    img.src = page; // 写了一个字符串 webpack不会进行查找
    document.body.appendChild(img);
    
    - webpack.config.js
    // 转化base64只在8192字节一下转化。其他情况下输出图片
    {test:/.(jpg|png|gif)$/,use:'url-loader?limit=8192'},
    {test:/.(eot|svg|woff|woff2|wtf)$/,use:'url-loader'},
    

    这里图被转成了base64到了js文件里

    1,js过大,2,超过8k的一般不需要base64

    - webpack.config.js
                {test: /.(jpg|png|gif)$/, use: 'url-loader?limit=8192'},
                {test: /.(eot|svg|woff|woff2|wtf)$/, use: 'url-loader'},
    

    注这里index.html和bundle.js放到同一个目录下(在上图的基础上index.html文件目录做了调整)

    webpack解析html

    npm install html-webpack-plugin --save-dev

    webpack html模板使用

    npm install webpack-dev-server --save-dev
    
    - webpack.config.js
    let HtmlWebpackPlugin = require('html-webpack-plugin');
        plugins:[
            new HtmlWebpackPlugin({ // 自动插入到dist目录中
                template:'./src/index.html', // 使用的模板
               // filename:'login.html' // 产出的文件名字
            })
        ]
        
    - 查看产出
    在模板的基础上加了
    <script type="text/javascript" src="bundle.js"></script></body>
    

    开发环境(本质是个服务器)

    1,不产出dist
    2,页面自动刷新
    3,修改自动编译

    npm install webpack-dev-server --save-dev
    
    - package.json
      "scripts": {
        "build": "webpack",
        "dev": "webpack-dev-server"
      },
    
    - 启动测试
    npm run dev
    

    小结

    - 安装(注意webpack和webpack-dev-server的版本号)
    npm init -y
    npm install --save-dev webpack@3 webpack-dev-server@2 babel-core babel-loader babel-preset-es2015 babel-preset-stage-0 css-loader style-loader less less-loader file-loader url-loader html-webpack-plugin
    
    
    - webpack.config.js
    let path = require("path");
    let HtmlWebPackPlugin = require("html-webpack-plugin");
    
    module.exports = {
        entry: "./src/main.js",
        output: {
            path: path.resolve('./dist'),
            filename: "bundle.js"
        },
        module: {
            rules: [
                {test: /.js/, use: "babel-loader", exclude: /node_modules/},
                {test: /.css/, use: ['style-loader', 'css-loader'], exclude: /node_modules/},
                {test: /.(jpg|png|gif|jpeg)$/, use: 'url-loader?limit=8192', exclude: /node_modules/},
            ]
        },
        plugins: [
            new HtmlWebPackPlugin({
                template: "./src/index.html"
            })
        ]
    };
    
    mdkir src/
    touch src/index.html
    
    - .babelrc
    {
        "presets": ["es2015","stage-0"]
    }
    
    
    - main.js
    document.write("maotai");
    import "./index.css"
    
    
    - package.json
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "build": "webpack",
        "dev": "webpack-dev-server"
      },
    

    webpack结合vue

    创建vue文件模板:模板格式是固定写法

    npm install vue
    
    - App.vue
    //import Vue from 'vue' //1.默认引入的是runtime vue=compoliter+runtime
    import Vue from 'vue/dist/vue.js'
    
    
    new Vue({
        el: "#app",
        template: "<div>hello world</div>"
    });
    
    - 
    import Vue from 'vue'  //1.默认引入的是runtime vue=compoliter+runtime, 2,render可以充当compliter的作用
    
    new Vue({
        el: "#app",
        //1,createElement返回的是虚拟dom 2,render将虚拟dom转换为真实dom
        render: function (createElement) {
            console.log(createElement('h1', ['maotai',
                createElement('span', '毛台喜欢的事情')
            ])); //返回vNode
            return createElement('h1', ['maotai',
                createElement('span', '毛台喜欢的事情')
            ]);
        }
    });
    
    
    - 
    import Vue from 'vue'
    
    new Vue({
        render: (h) => h('h1', ['hello', h('span', '一则头条')])
    }).$mount('#app');
    
    - 1.安装(注意版本)
    npm i --save-dev vue-loader@13 vue-template-compiler@2
    
    npm install vue-template-compiler //解析vue模板
    npm install vue-loader            //1.解析.vue文件 2.会自动调用 vue-template-compiler
    
     
    
    - 2. webpack.config.js
    {test: /.vue$/, use: 'vue-loader'},
    
    
    
    - 3. App.vue
    <template>
        <div>123123213213</div>
    </template>
    
    <script>
        export default {
            data() {
                return {}
            },
            methods: {},
            computed: {},
            componets: {}
        }
    </script>
    <style scoped>
    
    </style>
    
    - 4. main.js
    import Vue from 'vue'
    import App from "./App.vue"
    
    console.log(App); //1.一个对象 2,render接收一个组件 3,render将其渲染成真实dom
    
    new Vue({
        render: (h) => h('h1', ['hello', h('span', '一则头条')])
    }).$mount('#app');
    
    
    - 
    import Vue from 'vue'
    import App from "./App.vue"
    
    
    new Vue({
        render: (h) => h(App) //渲染组件
    }).$mount('#app');
    

  • 相关阅读:
    eri
    elasticsearch集群搜集nginx日志
    linux 常用
    如何清理Docker占用的磁盘空间?
    ubuntu1804 64位 apt源
    postgresql笔记
    web前端——02 body标签中相关标签
    web前端——01 html介绍和head标签
    python数据库——pymysql模块的使用
    MySql数据库——可视化工具Navicat的使用
  • 原文地址:https://www.cnblogs.com/iiiiiher/p/9061096.html
Copyright © 2011-2022 走看看