webpack4搭一个简易SPA应用

栏目: 编程工具 · 发布时间: 5年前

内容简介:webpack 在如今的前端开发中,算是不可绕过的一个工具吧。特别是在开发SPA应用的时候,无论是开发环境,还是打包上线,都十分依赖webpack。

webpack 在如今的前端开发中,算是不可绕过的一个 工具 吧。特别是在开发SPA应用的时候,无论是开发环境,还是打包上线,都十分依赖webpack。

开发环境

win10

node -v: 10.15.0

npm -v: 6.4.1

Let's go。

体验0配置

进入到工作目录,然后创建项目

mkdir spa-webpack-demo
复制代码

初始化

npm init -y
复制代码

先来体验下 webpack40配置 :

安装 webpack

npm i -D webpack
复制代码

安装好 webpack 依赖后,创建 src 文件夹,并在 src 中新建一个 index.js

mkdir src
cd src
type nul > index.js
复制代码

修改 package.json ,在 scripts 选项中,添加两个命令:

"dev": "webpack --mode=development",
"prod": "webpack --mode=production"
复制代码

好,完事了。接下来跑命令行,测试一下

npm run dev
复制代码

正常情况下,控制台会有一段如下提示,因为 webpack 命令需要依赖 webpack-cli ,我们安装即可

Do you want to install 'webpack-cli' (yes/no): yes
复制代码

webpack-cli 安装完成之后,会自动继续跑我们的 npm run dev 指令,即可看到项目中多了一个 dist 目录,而且多了一个 main.js

接下来继续尝试 npm run prod ,可以看到 dist/main.js 已被压缩。

这就是 webpack 号称的零配置,主要的工作就是定义了默认的 entry 路径 src/index.js ,定义了默认的 output 路径 dist/main.js ,然后加了一个 mode 参数,根据 mode 参数的不同帮我们添加一些预置的打包规则。

循序渐进

上述的流程里,只是体验了一把零配置的感觉,连html文件都没有,这里开始加上。

加个index.html

在根目录新建 index.html ,随便编写点内容

type nul > index.html
复制代码

说到处理 html 文件,肯定少不了 html-webpack-plugin , 安装它

npm i -D html-webpack-plugin
复制代码

然后再 项目根目录 新建一个 webpack.config.js ,webpack会自动使用它

type nul > webpack.config.js
复制代码

webpack.config.js 的内容如下

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    module: {
        rules: []
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'index.html',
            template: 'index.html'
        })
    ]
}
复制代码

执行 npm run dev ,即可看到 dist 文件夹多了个 index.html ,这个 index.html 自动引入了打包后的 dist/main.js

加个本地服务器

index.html 是生成了,可总不能每次手动打开它在浏览器里面预览吧, webpack 官方推荐我们用 webpack-dev-server 做服务器,安装它

npm i -D webpack-dev-server
复制代码

安装成功后, 修改 webpack.config.js ,添加 devServer 选项 和 webpack.HotModuleReplacementPlugin 插件。

对于文件中已经添加过的内容,后面我都会用注释表示。

const path = require('path');
const webpack = require('webpack');

function resolve(dir) {
    return path.join(__dirname, './', dir)
}

module.exports = {
    // module - 略
    devServer: {
        contentBase: resolve('dist'), // 根目录
        hot: true,   // 是否开启热替换,无须手动刷新浏览器
        port: 8081,    // 端口
        open: true,     // 是否自动打开浏览器
        noInfo: true   // 不提示打包信息,错误和警告仍然会显示
    },
    plugins: [
        new webpack.HotModuleReplacementPlugin(),
        // HtmlWebpackPlugin - 略
    ]
}
复制代码

然后修改 package.json scriptsdev 选项

"dev": "webpack-dev-server --mode=development",
复制代码

注意:当 devServerhot 参数为 true 时,记得要在插件里添加 new webpack.HotModuleReplacementPlugin() , 或者你可以在命令行中带上 hot 参数,这样就不需要自己再往 plugins 中添加插件了。

"dev": "webpack-dev-server --hot --mode=development"
复制代码

然后 npm run dev ,就可以尝试 静态资源 热替换功能了。

处理js, css 等其他静态资源

首先我们要清楚一点,webpack 它本身是不知道应该如何处理静态资源的,但是它提供了 loaderplugin 机制。

loader 的作用,顾名思义:加载器,就是匹配到的静态资源,都要经过 loader 的内部处理,再返回处理之后的结果。我觉得, loader 像是一个拦截器。

说到js,我们会想到 babel-loaderbabel-loader 是干吗的?常规操作是,将匹配到的 js文件 的ES6代码 根据 babelrc文件内的配置 编译成对应的 ES5代码。

我们这里先添加一个 .babelrc 文件

新增 .babelrc 文件

type nul > .babelrc
复制代码

编辑 .babelrc 内容

{
    // 预设置,告诉Babel要转换的源码使用了哪些新的语法特性
    // targets, useBuiltIns 等选项用于编译出兼容目标环境的代码
    // 其中 useBuiltIns 如果设为 "usage"
    // Babel 会根据实际代码中使用的 ES6/ES7 代码,以及与你指定的 targets,按需引入对应的 polyfill
    // 而无需在代码中直接引入 import '@babel/polyfill',避免输出的包过大,同时又可以放心使用各种新语法特性。
    "presets": [
        ["@babel/preset-env", {
            // modules 是否 将 ES6 的 import/export模块化 转为 babel 的 CommonJs 规范模块化
            "modules": false,
            "targets": {
                // "> 1%" : 支持市场份额超过1%的浏览器, 
                // ""last 2 versions"": 支持每个浏览器最后两个版本
                // "not ie <= 8": 在之前条件的浏览器中,排除 IE8 以下的浏览器
                "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
            },
            "useBuiltIns": "usage"
        }]
    ],
    // 所用插件
    // transform-runtime 插件表示不管浏览器是否支持ES6,只要是ES6的语法,它都会进行转码成ES5
    // 这个是需要优化的
    "plugins": ["@babel/plugin-transform-runtime"]
}
复制代码

安装 babel 依赖,注意:

babel 7+ 已经废弃了presets 中 stage-x 的用法,改为在plugins中添加。并且应用了npm scope包,代码全部在 @babel 中,避免以前那种 babel-preset-xxx, babel-plugin-xxx 的用法

最新的 babel-loader 版本是8+,需要依赖 babel-core 版本7+,包名为 @babel/core, 版本6+的包名为 babel-core

再分析上面的 .babelrc 文件,它用到了@babel/preset-env, @babel/plugin-transform-runtime, 这些依赖都要我们安装好

如果使用了 @babel/preset-env,则不支持在 plugins 中 添加 stage-x

npm i -D babel-loader @babel/core @babel/preset-env @babel/plugin-transform-runtime
复制代码

谈到css,我们就应该 想到 style-loadercss-loader 。先安装它们

npm i -D style-loader css-loader
复制代码

再安装 url-loader 用于解析静态资源,如图片,字体等

npm i -D url-loader
复制代码

然后修改 webpack.config.jsrules , 添加如下代码

module.exports = {
    module: {
        rules: [
            {
                test: /\.js$/,
                loader: 'babel-loader', 
                include: [
                    resolve('src'),
                    resolve('node_modules/webpack-dev-server/client')
                ]
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            },
            {
                test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
                loader: 'url-loader',
                exclude: [],
                options: {
                    limit: 10000,
                    name: 'img/[name].[hash:7].[ext]'
                }
            }
        ]
    },
    // devServer - 略
    // plugins - 略
}
复制代码

接下来准备开发了,用 vue 吧。

vue 就不用装在 devDependencies 中了。

npm i -S vue 
// vue-loader 依赖 vue-template-compiler 和 vue-style-loader
npm i -D vue-loader vue-template-compiler vue-style-loader
复制代码

修改 webpack.config.js , 添加 如下代码

const { VueLoaderPlugin } = require('vue-loader');

module.exports = {
    resolve: {
        extensions: ['.js', '.vue', '.json'],
        alias: {
            '@': resolve('src')
        }
    },
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            
            // 其他 - 略
        ]
    },
    // devServer - 略
    plugins: [
        // 加在最前面
        new VueLoaderPlugin()
        
        // 其他 - 略
    ]
}
复制代码

src 下 新建一个 views 目录 和 assets 目录,

我在 assets 目录下,增加了一个 logo.png 文件

views下创建一个 myTest 组件, myTest/index.vue , 编辑 index.vue

<template>
    <div>
        <i class="logo"></i>
    </div>
</template>

<script>
export default {
    name: 'myTest'
}
</script>

<style scoped>
    .logo {
        display: block;
        margin: auto;
        width: 400px;
        height: 400px;
        background: url(../../assets/logo.png);
    }
</style>
复制代码

src 目录下新建一个 App.vue , 内容如下

<template>
  <div id="app">
    <my-test></my-test>
  </div>
</template>

<script>
import myTest from "./views/myTest/index";

export default {
  name: "App",
  components: {
    myTest
  }
};
</script>
复制代码

编辑 src 目录下的 index.js ,内容如下:

import Vue from 'vue';

import App from './App';

new Vue({
    el: '#app',
    render: h => h(App)
})
复制代码

最后 npm run dev ,查看效果。

锦上添花

添加 打包进度条 信息,如下

npm i -D progress-bar-webpack-plugin
复制代码

修改 webpack.config.js

const ProgressBarPlugin = require('progress-bar-webpack-plugin');

// ....

plugins: [
    // 其他 - 略
    new ProgressBarPlugin()
]
复制代码

添加 打包结果消息通知

npm i -D webpack-build-notifier
复制代码

修改 webpack.config.js

const WebpackBuildNotifierPlugin = require('webpack-build-notifier');

// ....

plugins: [
    // 其他 - 略
    new WebpackBuildNotifierPlugin()
]
复制代码

归类打包信息

npm i -D webpack-dashboard
复制代码

修改 webpack.config.js

const DashboardPlugin = require('webpack-dashboard/plugin');

// ....

plugins: [
    // 其他 - 略
    new DashboardPlugin()
]
复制代码

修改 package.json

"dev": "webpack-dashboard -- webpack-dev-server --mode=development"
复制代码

这个我使用了,感觉效果不是很理想啊,会新开一个窗口,而且还不能滚动查看信息,不清楚是不是哪里用错了。

效果如图:

webpack4搭一个简易SPA应用

整个代码结构如图:

webpack4搭一个简易SPA应用

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

白话大数据与机器学习

白话大数据与机器学习

高扬、卫峥、尹会生 / 机械工业出版社 / 2016-6 / 69

本书通俗易懂,有高中数学基础即可看懂,同时结合大量案例与漫画,将高度抽象的数学、算法与应用,与现实生活中的案例和事件一一做了关联,将源自生活的抽象还原出来,帮助读者理解后,又带领大家将这些抽象的规律与算法应用于实践,贴合读者需求。同时,本书不是割裂讲解大数据与机器学习的算法和应用,还讲解了其生态环境与关联内容,让读者更全面地知晓渊源与未来,是系统学习大数据与机器学习的不二之选: ·大数据产业......一起来看看 《白话大数据与机器学习》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换