使用webpack搭建vue项目实现脚手架功能


Posted in Javascript onMarch 15, 2019

本文基于node.js开发环境,安装完node之后新建项目,通过webpack配置,实现vue-cli脚手架功能

对于刚刚接触编程的人来说,最难的可能并不是学习一种新语法或者框架,而是编程思维,这种思维在调试的时候显得尤为重要,拥有良好的编程习惯和思维能力可以大幅度提高调试效率。而编程思维的培养往往需要经验的积累,只有把底层原理一遍遍地思考之后,才会有更深入的理解,这也是vue官方文档中不建议vue初学者直接使用vue-cli的原因之一。

所以今天特意一步步通过webpack配置,实现与vue-cli相同的效果,希望大家能有所收获。

1. 创建一个vue项目

使用命令行mkdir vuedeom 或者直接新建一个vuedemo空文件夹,然后命令行cd vuedemo,使用npm init -y初始化,此时你会看到文件夹多了一个package.json的文件,内容大致如下:

{
 "name": "vuedemo",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
 "test": "echo \"Error: no test specified\" && exit 1"
 },
 "keywords": [],
 "author": "",
 "license": "ISC"
}

2. 引入webpack

通过npm加载webpack,当然如果速度慢的话你也可以使用淘宝镜像,npm install -g cnpm ?registry=https://registry.npm.taobao.org,然后输入命令:cnpm install webpack --save-dev

接下来我们在项目根目录创建一个src文件,有一个main.js,再创建一个webpack.config.js,最后修改package.json的脚本:

const path = require('path') //引入node内置模块path
module.exports ={
 entry:'./src/main.js',  // 入口文件,把src下的main.js编译到出口文件
 output:{     //出口文件
  path:path.resolve(__dirname,'dist'), //出口路径和目录
  filename:"demo.js"      //编译后的名称
 }
}
//package.json
{
 "name": "vuedemo",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
 "build":"webpack" //当使用npm run build的时候就会执行webpack,按照提示安装webpack-cli
 },
 "keywords": [],
 "author": "",
 "license": "ISC"
}

3. babel编译

虽然ES6语法已经广泛普及,但各个浏览器还不是特别兼容,为了避免出错我们需要把ES6转成ES5,使用babel进行编译

npm install --save-dev babel-core babel-loader

加载完成之后,在webpack.config.js配置

const path = require('path')

module.exports ={
 entry:'./src/main.js',
 output:{
  path:path.resolve(__dirname,'dist'),
  filename:"demo.js"
 },
 module:{
  rules:[ //遍历规则
   {
    test: /\.js$/, //匹配以js结尾的文件
    loader:"babel-loader", // 使用babel-loader编译
    exclude: /node_modules/ //node_module里面的内容不遍历
   }
  ]
 }
}

我测试的时候出现了这样的错误,如果有相同情况的可以参考下:

Error: Cannot find module '@babel/core'
 babel-loader@8 requires Babel 7.x (the package '@babel/core'). If you'd like to use Babel 6.x ('babel-core'), you should install 'babel-loader@7'.

这是因为版本之间的不兼容,按照上面的要求,你可以安装低版本的babel-loader@7

也有可能webpack会发出这样的警告:

WARNING in configuration
The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.

你需要给脚本配置一个环境,一般build我们会用生产环境webpack --mode production,而dev会使用生产环境webpack --mode development (这个下面会讲)

另外,有时候我们可能会遇到不能识别webpack命令,原因未知,不过重新安装一次就可以了...

接下来需要让babel-loader翻译官具有翻译的功能:

npm install babel-preset-es2015 --save-dev

并且新建一个.babelrc的文件,里面新建

{ "presets":["es2015"] }

如果需要转译ES7语法,你还需要安装

npm install babel-preset-stage-0 --save-dev

同样在.babelrc添加

{ 
"presets":["es2015"."stage-0"]
}

每次修改配置之后都要重新编译:npm run build

4. 解析样式

上面我们实现了vue引入和es6以及es7语法转译,现在我们来解析样式,需要安装两个包

npm install css-loader style-loader --save-dev

css-loader将css解析成模块,style-loader将解析的内容插入到style标签内

别忘了在配置里webpack.config.json添加规则

rules:[{test:/\.css$/,use:['style-loader','css-loader']}]

但是大多数时候,我们在vue中会使用样式预处理语言,比如sass、less、stylus,同样地我们需要安装对应的包,添加对应的规则

npm install less less-loader --save-dev
rules:[ {test:/\.less$/,use:['style-loader','css-loader','less-loader']}]

5. 解析图片

图片是大多数项目不可获取的部分,怎样解析图片呢?和解析样式步骤差不多,我们需要先安装包再添加规则

npm install file-loader url-loader --save-dev
rules:[

{test:/\.(jpg|png|gif)$/,use:'url-loader?limit=8192'},

{test:/\.(eot|svg|woff|woff2|wtf)$/,use:'url-loader'}

]

limit表示转化base64只在8192字节一下转化,其他情况输出图片

6. 解析html

我们希望build之后能有一个html文件,能直接看到编译之后的效果

这时就需要一个插件,插件的作用是以我们自己的html为模板将打包后的结果,自动引入到html中产出到dist目录下

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

在webpack.config.js引入这个插件

let HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
 ....省略
 plugins:[new HtmlWebpackPlugin({ //自动插入到dist目录中
  template:'./index.html' //使用模板
  filename:'login.html'   //产出名称(一般不写)
 })]
}

build之后你就可以看到dis下有一个index.html文件

 7. 开发环境

一个项目创建分为开发环境和生产环境(上线),那么在开发的时候每次都需要build很不方便,而且build之后相当于最终的代码,不能随意更改,我们需要把这些内容都放到内存中,通过npm run dev打开

npm install webpack-dev-server --save-dev

这里边内置了服务,可以帮我们启动一个端口号,当代码更新时,自动在内存中打包,代码有变化就重新执行

并且在package.json添加一个新脚本:"dev":"webpack-dev-server --mode development"

一般webpack-dev-server会内置一个端口,通过这个端口就能查看编译的内容了,比如我的端口号:http://localhost:8080

8. 配置vue

上面我们已经实现了基本的webpack配置,完成了html、css、less、图片、js等文件的解析,但我们最终想要的适合vue-cli一样的效果,这就要求我们还要对vue语法进行解析,如果你在main.js引入vue模块,使用vue时,你会发现控制台打印这样的错误

vue.runtime.esm.js:620 [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

这是因为默认的vue引用的是vue.runtime.common.js,不能编译模板,你可以在引入vue的时候直接import Vue from 'vue/dist/vue'

另外一种办法是,你可以使用render函数,注意render()要有返回值

但是不管是改变vue引用js还是使用render函数都是不方便的,我们更希望页面组件能以.vue文件加载到html文件中

我们可以通过安装vue-loader(解析.vue文件)和vue-template-compiler(解析template模板)实现

npm install vue-loader vue-template-compiler --save-dev

之后我们在main.js引入App.vue模块,然后在render()引用:render:(h)=>h(App)

最后

到这里我们就实现了和vue-cli初始化出来的vue项目一样的效果,其实整个过程并不算太难,不过一步步实现还是很有帮助,vue初学者可以动手试试。当然,文章可能会有我疏忽的地方,有问题随时联系我呀~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
Jul 31 Javascript
js实现广告漂浮效果的小例子
Jul 02 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
Jan 02 Javascript
jQuery实现鼠标经过图片预览大图效果
Apr 10 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
Jun 12 Javascript
ES6概念 ymbol.for()方法
Dec 25 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 Javascript
基于Jquery Ajax type的4种类型(详解)
Aug 02 jQuery
浅谈JavaScript的innerWidth与innerHeight
Oct 12 Javascript
vue项目总结之文件夹结构配置详解
Dec 13 Javascript
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
微信小程序使用GoEasy实现websocket实时通讯
May 19 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
Mar 15 #Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
Mar 15 #Javascript
浅谈KOA2 Restful方式路由初探
Mar 14 #Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 #Javascript
详解React项目中碰到的IE问题
Mar 14 #Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
Mar 14 #Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 #Javascript
You might like
php中通过curl smtp发送邮件
2012/06/05 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
Js callBack 返回前一页的js方法
2008/11/30 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue实现商城秒杀倒计时功能
2019/12/12 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
python操作gmail实例
2015/01/14 Python
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
python实现飞机大战游戏
2020/10/26 Python
python实现ip代理池功能示例
2019/07/05 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
业务员岗位职责
2013/11/16 职场文书
收银员岗位职责
2014/02/07 职场文书
会务接待方案
2014/02/27 职场文书
新农村建设汇报材料
2014/08/15 职场文书
安全教育第一课观后感
2015/06/17 职场文书
《搭石》教学反思
2016/02/18 职场文书
那些美到让人窒息的诗句,值得你收藏!
2019/08/20 职场文书
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL