不用vue-cli脚手架,利用webpack纯手工搭建简单vue-cli
初始化项目,安装依赖
初始化项目,生成package . json文件: npm init - y
安装依赖:npm i webpack vue vue- loader
警告:vue- loader@15.9 .6 requires a peer of css- loader@* but none is installed。
解析:vue- loader 需要一个依赖 ( peer) 但是没有安装。有这种警告的直接依次安装,直到没有这种警告
警告:ssrlearn@1.0 .0 No description 或 ssrlearn@1.0 .0 No repository field
解析:这种不用理他
创建src目录,创建app.vue文件作为主vue文件 (此时vue文件无法在浏览器运行) src目录下,创建app.vue对应的 index.js 入口文件 (导入vue文件,因为webpack打包文件的入口都是js文件)
import Vue from 'vue'
import App from './app.vue'
const root = document. createElement ( 'div' )
document. body. appendChild ( root)
new Vue ( {
render: ( h) => h ( App)
} ) . $mount ( root)
创建webpack.config.js文件,打包前端资源。以js文件为入口
const path = require ( 'path' )
module. exports = {
entry: path. join ( __dirname, 'src/index.js' ) ,
output: {
filename: 'bundle.js' ,
path: path. join ( __dirname, 'dist' )
}
}
在package.json中加入webpack打包命令。因为在这里才会调用node_modules中的webpack而不是全局webpack
"scripts" : {
"build" : "webpack --config webpack.config.js"
}
npm run build 运行打包。 报错:You may need an appropriate loader to handle this file type,报错原因:需要一个loader处理对应的vue文件,因为webpack只认识js,其他loader报错同理。解决:在webpack中加入 loader
module: {
rules: [ {
test: /\.vue$/ ,
loader: 'vue-loader'
} ]
}
npm run build 还是报错。 报错:vue-loader was used without the corresponding plugin。报错原因:需要一个插件处理vue-loader。解决。在webpack中加入 VueLoaderPlugin
const { VueLoaderPlugin} = require ( 'vue-loader' )
plugins: [ new VueLoaderPlugin ( ) ] ,
其他loader使用
module: {
rules: [ {
test: /\.vue$/ ,
loader: 'vue-loader'
} , {
test: /\.css$/ ,
use: [ 'style-loader' , 'css-loader' ]
} , {
test: /\.(gif|jpg|jpeg|png|svg)$/ ,
use: [ {
loader: 'url-loader' ,
options: {
limit: 1024 ,
name: '[name].[ext]'
}
} ]
} , {
test: /\.styl/ ,
use: [ 'style-loader' , 'css-loader' , 'stylus-loader' ]
} ]
}
注意:以上loader都要npm安装
webpack-dev-server 。用于开发环境运行,监听端口号,开发环境跨域
先安装 npm i webpack- dev- server
再添加命令
"scripts" : {
"dev" : "webpack-dev-server --config webpack.config.js"
}
cross-env 。用于linux或window系统都能用一个命令(不加这个window跟linux下列两行命令会有区别) 修改命令:区分运行环境与开发环境
"build" : "cross-env NODE_ENV=production webpack --config webpack.config.js" ,
"dev" : "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js"
webpack中判断是开发环境还是生产环境。用于区分环境设置devServer,开发环境的调试
const config = { entry: xxx... . }
const isDev = process. env. NODE_ENV === 'development'
if ( isDev) {
config. devServer = {
port: '8000' ,
host: '0.0.0.0' ,
overlay: {
errors: true
}
}
}
module. exports = config
html-webpack-plugin。将js、vue等文件绑定在html上。
先安装插件 npm i html- webpack- plugin
再添加进webpack配置插件项中
const HtmlWebpackPlugin = require ( 'html-webpack-plugin' )
plugins: [ new HtmlWebpackPlugin ( ) ]
DefinePlugin。用于将vue源码区分,开发环境有很多vue源码生产环境中是不需要的。
先导入webpack
const webpack = require ( 'webpack' )
plugins: [ new webpack. DefinePlugin ( {
'process.env' : {
NODE_DEV : isDev ? '"development"' : '"production"'
}
} ]
运行命令 npm run dev 报错:Cannot find module ‘webpack-cli/bin/config-yargs’。 报错原因:之前的webpack-cli版本太高了,指定一个webpack@3.3就好了
"webpack" : "^5.23.0" ,
"webpack-cli" : "^3.3.12" ,
"webpack-dev-server" : "^3.11.2"
npm run dev 。发现代码如期成功。并且此时并不需要public中的index.html。因为在index.js中自己创建了一个div,加入到了html中。 webpack-dev-server 其他开发环境配置简单介绍
open: true 运行命令自动打开浏览器
hot: true 组件更新不会更新整个页面 需要配合以下两个插件使用 -- -
new webpack. HotModuleReplacementPlugin ( ) , new webpack. NoEmitOnErrorsPlugin ( )
vue的jsx写法和postcss
运行命令安装依赖
npm i postcss- loader autoprefixer babel- loader babel- core
创建postcss.config.js文件
const autoprefixer = require ( 'autoprefixer' )
module. exports = {
plugins: [ autoprefixer ( ) ]
}
创建.babelrc文件
{
"presets" : [ "env" ] ,
"plugins" : [ "transform-vue-jsx" ]
}
运行命令:npm i babel- preset- env babel- plugin- transform- vue- jsx
在webpack.config.js文件中添加 jsx 对应loader。并且预编译器要加入postcss-loader
{
test: /\.jsx$/ ,
loader: 'babel-loader'
} , {
test: /\.styl/ ,
use: [ 'style-loader' ,
'css-loader' ,
{ loader: 'postcss-loader' , options: { sourceMap: true } } ,
'stylus-loader' ]
}
jsx后缀文件的使用。以vue为对比,style部分直接import导入;template标签部分写在render方法中;script部分不变
import '../assets/styles/footer.css'
export default {
data ( ) {
return {
author: "liu" ,
} ;
} ,
render ( ) {
return (
< div id= "footer" >
< span> write by mr. { this . author} < / span>
< / div>
)
}
}
打包优化
生产环境将css单独分离打包