当前前端开发,90%的项目都是Vue和React,然而70%的同学都基于脚手架创建项目,因为脚手架会包含项目基本框架、webpack配置、scss/sass/less解析、babel配置、DevServer、JSX/Vue文件解析、CSS前缀等,我们要做的就是开发功能模块,也就是开箱即用。

如果不用脚手架,我们怎么编写配置?此文章要求对Vue/React有一点基础.

技术文档:

Webpack: https://www.webpackjs.com/

Vue: https://cn.vuejs.org/

React: https://react.docschina.org/

开发环境

IDE推荐VSCode、浏览器推荐Chrome/Edge、Node版本:v12.13.0

创建项目

# 进入工作空间cd workspace# 创建项目mkdir webpack-demo (window用户直接右键创建)# 进入到项目中cd webpack-demo# 初始化配置(默认一路回车)npm init

打开项目

创建目录

node_modules:项目依赖目录,提前创建是为了添加gitignore

public:Vue项目静态目录,仿Vue4.0脚手架

src:项目源码

.gitignore:忽略Git提交文件

初始化为Git项目(方便管理)

# 终端下执行git init

编写代码(基础部分直接上代码)

index.html

# public下index.html            Vue    

main.js

# main.js入口import Vue from 'vue'import App from './app.vue'new Vue({    el:'#app',    render:(h)=>h(App)})

app.vue

    

欢迎学习webpack4.42知识

{{title}}

export default { name:'app', data(){ return { title:'Hello Vue' } } } .app{ text-align: center; }

创建Webpack配置

webpack默认配置:webpack.config.js,不建议修改名字

前端常用规范:AMD、CMD、CommonJS、ES,webpack遵循的是CommonJS规范,需要使用module.export导出。

打包基本配置

# webpack4.42版本,内容讲解module.exports = {    mode:'development',//指定环境,生成:production    entry:'./src/main.js',//项目入口    //项目输出    output:{        // [name]指原名字         // [hash]会生成hash串添加在name后面        filename:'[name].[hash].js',        // 打包输出目录        //__dirname是node语法,指当前目录意思        path:__dirname+'/dist',        // 根路径默认/,用在打包后的js/css上面        publicPath:'/',        // 打包模块名称        library:'webpack-demo',        // 打包模块方式,umd实际上是AMD+CMD混合        libraryTarget:'umd'    }}

通过library设置后如下:

注:以上代码只是打包的基础配置,只能打包原生JS,还不能编译Vue项目。

安装依赖

分析Vue文件,我们会发现,包含ES6、.vue、scss语法所以我们需要安装对应插件。

开发Vue项目,必然需要安装Vue

cnpm i vue -S# OR cnpm install vue --save

--save 和 --save-dev区别:save会保存在dependencies里面,save-dev会保存在devDependencies里面,项目生产依赖用save,项目开发依赖用dev.

安装loader

# vue-loader 解析.vue文件vue-loader vue-template-compiler# 解析scss/sass语法node-sass sass-loader# 添加样式前缀 postcss-loader autoprefixer# 把scss/less转换为csscss-loader# 把css转化为style样式style-loader# 解析ES6语法(必须安装三个)@babel/core @babel/preset-env babel-loader# 解析图片(file-loader增强版)url-loader file-loader# 安装到dev依赖中cnpm i vue-loader vue-template-compiler node-sass sass-loader postcss-loader autoprefixer css-loader style-loader @babel/core @babel/preset-env babel-loader url-loader file-loader -D

以上是针对本次Vue项目所需要安装的插件和loader

/** * webpack4.42版本,内容讲解 * module可以设置模块解析规则和loader * test 校验规则 * use 加载loader,从右往左 * exclude 排除目录 * include 包含目录 */module.exports = {  // mode、entry、output参考上面  module:{        rules:[            {                test:/\.css$/,                use:['style-loader','css-loader','postcss-loader'],                exclude:/node_modules/,                include:/src/            },{                test:/\.vue$/,                loader:'vue-loader',                exclude:/node_modules/,                include:/src/            },{                test:/\.(js|.jsx)$/,                loader:'babel-loader',                exclude:/node_modules/,                include:/src/            },{                test:/\.(png|jpg|gif|svg)$/,                use:{                    loader:'url-loader',                    options:{                        // 10k以下用base64                        limit:10                    }                },                exclude:/node_modules/            },{                test:/\.(scss|sass)$/,                use:['style-loader','css-loader','postcss-loader','sass-loader'],                exclude:/node_modules/,                include:/src/            }        ]    }}

安装webpack

# 打包必须webpack webpack-cli # 启动本地服务器webpack-dev-server# 安装到开发依赖中cnpm i webpack webpack-cli webpack-dev-server -D

安装webpack-plugin

# 清空文件夹clean-webpack-plugin# html抽取打包html-webpack-plugin# 复制插件copy-webpack-plugin# 安装到开发依赖中cnpm i clean-webpack-plugin html-webpack-plugin copy-webpack-plugin -D

webpack-plugin配置

const { CleanWebpackPlugin } = require('clean-webpack-plugin');const HtmlWebpackPlugin = require('html-webpack-plugin');const VueLoaderPlugin = require('vue-loader/lib/plugin');const CopyWebpackPlugin = require('copy-webpack-plugin');module.exports = {    // mode/entry/output/module参考上面    plugins:[        // 打包前清空目录        new CleanWebpackPlugin(),        // 解析Vue需要配合插件使用        new VueLoaderPlugin(),        // 复制public内容到dist里面去        // vuecli4.0会生成public文件夹,里面包含index.html和静态资源        // 此处通过复制插件,在打包时,将public全部拷贝过去        new CopyWebpackPlugin([            {                from : __dirname + '/public',                to : __dirname + '/dist',                ignore: ['.*']            }        ]),        // html打包插件,会自动把js插入进去        new HtmlWebpackPlugin({            template:'public/index.html'        }),    ]}

DevServer配置

// 通过本地服务器访问Vue项目module.exports = {  devServer:{        // 服务根目录        contentBase:__dirname+"/dist",        // 服务主机        host:'localhost',        // 服务端口        port:8080,        // 代码热更新        hot:true,        // 默认打开浏览器        open:true,        // 默认打开的页面        openPage:'index.html',        // 接口代理,作用相当大        proxy:{            "/api":{                target:"http://lemall.futurefe.com"            }        }    }}

到此我们完成了大部分代码规则的配置,接下来,我们需要再添加两个小配置:.babelrc和postcss

创建.babelrc文件

{    "presets":[        "@babel/preset-env",        "@babel/preset-react"    ]}

注:Vue项目使用第一个,React项目使用第二个

@babel/preset-env 是 Vue babel插件

@babel/preset-react 是 React babel插件

添加postcss配置

通常有些项目会使用postcss.config.js,我们这儿推荐修改package.json,添加对应配置。

打开package.json,添加如下代码:

"postcss": {  "plugins": {    "autoprefixer": {}  }},"browserslist": [  "> 1%",  "last 2 versions"]

到此我们的项目全部配置完成,接下来,就添加运行脚本:

在scripts里面增加build和serve

"scripts": {    // 生产打包    "build": "webpack",    // 本地启动服务    "serve": "webpack-dev-server"  },

OK,接下来,运行cnpm run build即可打包代码:

开启本地服务:

最后,我们尝试添加图片代码,看看是否能解析:

  1. 拷贝图片到public下面

  2. 在app.vue中添加img标签

<div class="app">    <h1>欢迎学习webpack4.42知识h1>    <p>{{title}}p>    <p>欢迎关注:前端未来,关乎你的未来p>    <img src="/imgs/qrcode.jpg" alt="">div>

项目会自动热更新,截图如下:

代码已上传Github,有需要的同学,可自行下载:

https://github.com/JackySoft/webpack-demo

同样,大家可以模仿此文章打包React项目,React项目本身是jsx语法,通过babel-loader解析即可,代码基本不动,大家只需要添加React代码即可编译运行。

关注前端,关注未来,关乎你的未来

react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目相关推荐

  1. react打包后图片丢失_手写Webpack从0编译Vue/React项目

    当前前端开发,90%的项目都是Vue和React,然而70%的同学都基于脚手架创建项目,因为脚手架会包含项目基本框架.webpack配置.scss/sass/less解析.babel配置.DevSer ...

  2. 手写webpack系列一:了解认识loader-utils

    Created By JishuBao on 2019-03-29 12:38:22 Recently revised in 2019-04-01 12:38:22   欢迎大家来到技术宝的掘金世界, ...

  3. babel原理_手写webpack核心原理,再也不怕面试官问我webpack原理

    手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6转成ES5(AST) 七.递归获取 ...

  4. MNIST手写字体识别入门编译过程遇到的问题及解决

    MNIST手写字体识别入门编译过程遇到的问题及解决 以MNIST手写字体识别作为神经网络及各种网络模型的作为练手,将遇到的问题在这里记录与交流. 激活tensorflow环境后,运行spyder或者j ...

  5. Qt怎么实现将bmp图片转换成Ascii_怎么识别手写文字?迅捷OCR文字识别软件帮你快速完成...

    怎么识别手写文字?虽然现在手机.平板等设备已经普及开来,但是从小在学校养成的习惯,还是让大部分人选择会手写的方式.手写其实也有很大的缺陷,无论是在生活中还是在网络上进行分享都比较困难. 那么有没有将手 ...

  6. AI识别 图片识别 微信小程序(手写OCR)

    使用腾讯云手写OCR API的微信小程序 GitHub地址 主要功能:识别图片形式的手写笔记并展示 //appid等作为全局变量定义在了app.js里//使用时需将相应字段添加到app.js文件中gl ...

  7. react学习笔记 react-router-dom react-redux基础使用及手写基础源码 组件反射 react原理

    vdom diff 高效的diff算法 新老vdom树比较 更新只需要更新节点 数据变化检测 batch dom读写 组件多重继承 //parent components export default ...

  8. 手写webpack得打包流程

    目录 搭建一个最基础的环境(用于测试) 本地新建一个文件夹(打包库)webpack-meself 分析webpack环境打包后的js my-pack.js文件书写 手写Compiler.js 解析包, ...

  9. 机器学习:手写数字识别(Hand-written digits recognition)小项目

    该项目的所有代码在我的github上,欢迎有兴趣的同学与我探讨研究~ 地址:Machine-Learning/machine-learning-ex3/ 1. Introduction 手写数字识别( ...

最新文章

  1. urllib.parse包学习
  2. DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测
  3. web在线聊天系统。非ajax轮询
  4. JSON在PHP中的基本应用
  5. 从零开始使用Skywalking分布式链路追踪系统
  6. http长/短轮询和WebSocket 的介绍和比较
  7. ansys添加力矩_ANSYS软件中施加扭矩的方法
  8. 使用async读取异步数据
  9. (转)使用Spring配置文件实现AOP
  10. OSPF:STUB与NSSA区别
  11. 【word】为什么word分两栏的最后一页左边一栏没写完跑到右边去了
  12. python打印日历_Python怎么打印日历?
  13. visio 2003 问题
  14. html插入图片在古诗右侧,古诗词配插图
  15. 工商银行销售基金一览表
  16. 中国石油大学《微观经济学》第一次在线作业
  17. 三分之一的程序猿之创业组队与打怪升级
  18. VC版DoEvents/处理事件
  19. 华为fusion computer虚拟机存储数据恢复
  20. Unity CustomFont (怎么制作图片文字)

热门文章

  1. 计算机如何玩二十四点游戏,数学二十四点游戏有什么技巧吗?
  2. oracle导入导出版本规则,oracle expdp impdp 导出导入(支持高版本到低版本)
  3. BugkuCTF-MISC题where is flag
  4. 计算机关机键桌面,电脑桌面按钮关机关不了怎么办? 爱问知识人
  5. php毕设,php毕设
  6. mysql乐观锁重试_乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded...
  7. 打docker镜像_从安全到镜像流水线,Docker 最佳实践与反模式一览
  8. 类库java_Java类库和常用类库介绍
  9. java矩阵类_151-矩阵类
  10. .net core高并发_高并发下的Node.js与负载均衡