react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目
当前前端开发,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知识
欢迎学习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即可打包代码:
开启本地服务:
最后,我们尝试添加图片代码,看看是否能解析:
拷贝图片到public下面
在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项目相关推荐
- react打包后图片丢失_手写Webpack从0编译Vue/React项目
当前前端开发,90%的项目都是Vue和React,然而70%的同学都基于脚手架创建项目,因为脚手架会包含项目基本框架.webpack配置.scss/sass/less解析.babel配置.DevSer ...
- 手写webpack系列一:了解认识loader-utils
Created By JishuBao on 2019-03-29 12:38:22 Recently revised in 2019-04-01 12:38:22 欢迎大家来到技术宝的掘金世界, ...
- babel原理_手写webpack核心原理,再也不怕面试官问我webpack原理
手写webpack核心原理 一.核心打包原理 1.1 打包的主要流程如下 1.2 具体细节 二.基本准备工作 三.获取模块内容 四.分析模块 五.收集依赖 六.ES6转成ES5(AST) 七.递归获取 ...
- MNIST手写字体识别入门编译过程遇到的问题及解决
MNIST手写字体识别入门编译过程遇到的问题及解决 以MNIST手写字体识别作为神经网络及各种网络模型的作为练手,将遇到的问题在这里记录与交流. 激活tensorflow环境后,运行spyder或者j ...
- Qt怎么实现将bmp图片转换成Ascii_怎么识别手写文字?迅捷OCR文字识别软件帮你快速完成...
怎么识别手写文字?虽然现在手机.平板等设备已经普及开来,但是从小在学校养成的习惯,还是让大部分人选择会手写的方式.手写其实也有很大的缺陷,无论是在生活中还是在网络上进行分享都比较困难. 那么有没有将手 ...
- AI识别 图片识别 微信小程序(手写OCR)
使用腾讯云手写OCR API的微信小程序 GitHub地址 主要功能:识别图片形式的手写笔记并展示 //appid等作为全局变量定义在了app.js里//使用时需将相应字段添加到app.js文件中gl ...
- react学习笔记 react-router-dom react-redux基础使用及手写基础源码 组件反射 react原理
vdom diff 高效的diff算法 新老vdom树比较 更新只需要更新节点 数据变化检测 batch dom读写 组件多重继承 //parent components export default ...
- 手写webpack得打包流程
目录 搭建一个最基础的环境(用于测试) 本地新建一个文件夹(打包库)webpack-meself 分析webpack环境打包后的js my-pack.js文件书写 手写Compiler.js 解析包, ...
- 机器学习:手写数字识别(Hand-written digits recognition)小项目
该项目的所有代码在我的github上,欢迎有兴趣的同学与我探讨研究~ 地址:Machine-Learning/machine-learning-ex3/ 1. Introduction 手写数字识别( ...
最新文章
- urllib.parse包学习
- DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测
- web在线聊天系统。非ajax轮询
- JSON在PHP中的基本应用
- 从零开始使用Skywalking分布式链路追踪系统
- http长/短轮询和WebSocket 的介绍和比较
- ansys添加力矩_ANSYS软件中施加扭矩的方法
- 使用async读取异步数据
- (转)使用Spring配置文件实现AOP
- OSPF:STUB与NSSA区别
- 【word】为什么word分两栏的最后一页左边一栏没写完跑到右边去了
- python打印日历_Python怎么打印日历?
- visio 2003 问题
- html插入图片在古诗右侧,古诗词配插图
- 工商银行销售基金一览表
- 中国石油大学《微观经济学》第一次在线作业
- 三分之一的程序猿之创业组队与打怪升级
- VC版DoEvents/处理事件
- 华为fusion computer虚拟机存储数据恢复
- Unity CustomFont (怎么制作图片文字)
热门文章
- 计算机如何玩二十四点游戏,数学二十四点游戏有什么技巧吗?
- oracle导入导出版本规则,oracle expdp impdp 导出导入(支持高版本到低版本)
- BugkuCTF-MISC题where is flag
- 计算机关机键桌面,电脑桌面按钮关机关不了怎么办? 爱问知识人
- php毕设,php毕设
- mysql乐观锁重试_乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded...
- 打docker镜像_从安全到镜像流水线,Docker 最佳实践与反模式一览
- 类库java_Java类库和常用类库介绍
- java矩阵类_151-矩阵类
- .net core高并发_高并发下的Node.js与负载均衡