webpack(构建一个前端项目)详解--升级
升级一个正式的项目结构
分离webpack.config.js文件:
新建一个webpack.config.base.js任何环境依赖的wbpack
//public webpack
const path = require('path');
const config = {
target: 'web',
entry: path.join(__dirname, '../src/index.js'),
output: {
filename: 'bundle.[hash:8].js',
path: path.join(__dirname, '../dist')
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader'
},
{
test: /\.jsx$/,
loader: 'babel-loader'
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/ //node_modules忽略掉
},
{
test: /\.(gif|jpg|jpeg|png|svg)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 1024,
name: '/resource/[path][name].[hash:8].[ext]'//静态文件打包在资源文件下
}
}
]
}
]
}
}
module.exports = config
新建webpack.config.client.js他是依赖于webpack.config.base.js,利用webpack-merge工具扩展配置文件。合并各种webpack配置文件。根据webpack里面的各个项合理的合并webpack.config文件。
安装:npm install webpack-merge -D
.json:文件中的dependencies中只放vue的版本,其余版本放在devDependencies
const path = require('path');
const HTMLPlugin = require('html-webpack-plugin');
const webpack = require('webpack');
const ExtractPlugin = require('extract-text-webpack-plugin');//单独打包css文件的插件
const merge = require("webpack-merge");
const baseConfig = require("./webpack.config.base");
const isDev = process.env.NODE_ENV === 'development';
let config;
const defaultPlugins = [
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: isDev ? '"development"' : '"production"'
}
}),
new HTMLPlugin()
];
const devServer = {
port: 8099,
host: '0.0.0.0',
overlay: {
errors: true,
},
hot: true
};
if (isDev) {
config = merge(baseConfig,{//合并到baseConfig文件中
devtool: '#cheap-module-eval-source-map',
module: {
rules: [
{
test: /\.styl/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true,
}
},
'stylus-loader'
]
}
]
},
devServer,
plugins: defaultPlugins.concat([
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin()
])
});
} else {
config = merge(baseConfig,{
entry: {
app: path.join(__dirname, '../src/index.js'),
vendor: ['vue']
},
output:{
filename: '[name].[chunkhash:8].js'
},
module: {
rules: [
{
test: /\.styl/,
use: ExtractPlugin.extract({
fallback: 'style-loader',
use: [
'css-loader',
{
loader: 'postcss-loader',
options: {
sourceMap: true,
}
},
'stylus-loader'
]
})
}
]
},
plugins: defaultPlugins.concat([
new ExtractPlugin('styles.[contentHash:8].css'),
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor'
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'runtime'
})
])
});
}
module.exports = config
修改json文件:
"build": "cross-env NODE_ENV=production webpack --config build/webpack.config.client.js",
"dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js"
vue-loader的配置
在build文件下新建vue-loader.config.js
传入环境的判断,暴露出去一个对象,vue-loader相关的配置
preserveWhitepace: true,消除文本中的空格
extractCSS: true,//vue组件中的css打包到单独的文件中
cssModules: {},
hotReload: false,//默认情况下是在production的情况下关闭热重载,不必设置
//以下不怎常用:
定义全局的的loader
const docLoader = require.resolve("./doc-loader");
loaders: {
"docs": docLoader,
js: "coffe-loader"//指定了loader会根据相应的loader去解析它
},//自定义模块,
preLoader: {
//...
},//先解析哪一种loader
psotLoader: {
//...
}
//使用时添加在摸个组件中
<docs>
//...构建组件库的时候,给每一个组件写文档
</docs>
module.exports = (isDev) => {
return {
preserveWhitepace: true,
extractCSS: true
//这个实在线上环境是使用的所以开发版本不适用
extractCSS: isDev
}
}
在base.js中引入使用,修改rules下.vue-loader
const createVueLoaderOptions = require("./vue-loader.config");
const isDev = process.env.NODE_ENV === 'development';
{
test: /\.vue$/,
loader: 'vue-loader',
options: createVueLoaderOptions(isDev)
},
css的热跟新
默认的css是没有热更新的,要安装vue-style-loader
npm install vue-style-loader -D
安装了之后修改webpack.congif.js文件中的style-loader
打包之前删除上一次打包的文件
安装rimraf每次打包之前删除打包的上一个版本
npm install rimraf -D
在json文件中添加clear
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build:client": "cross-env NODE_ENV=production webpack --config build/webpack.config.client.js",
"build": "npm run clean && npm run build:client",
"clean": "rimraf dist",//删除文件
"dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.client.js"
}
cssModule的配置:
cssModules: {
localIdentName: "[path]-[name]-[hash:base64:5]"
//线上的可以省略路径,name
localIdentName: "[hash:base64:5]"
localIdentName: isDev ? "[path]-[name]-[hash:base64:5]" : "[hash:base64:5]"
//把css对应的类名,根据路径,文件名,文件内容的hsah生成一个独一无二的类名,调用是别的文件无法使用。
camelCase: teue//js命名方式,把css中带中划线的转换成驼峰命名。给使用的style标签添加module属性,原有css类修改:class="$style.mainHeader"
//外部css的使用:
在css-loader中配置,把css-loader变成一个对象
{
loader: "css-loader",
options: {
module: true,
localIdentName: isDev ? "[path]-[name]-[hash:base64:5]" : "[hash:base64:5]"
}
}
import className from "../../xx.styl";
<div id="className.xxx"></div>
}
selint
防止代码低级出错,团队协作统一性。使用eslint-config-standard的规范,它有依赖了很多的包
安装:
npm install eslint eslint-config-standard eslint-plugin-standard eslint-plugin-promise eslint-plugin-import eslint-plugin-node -D
在项目文件下创建.eslintrc文件:
{
"extends": "standard",//使用标准规则
//使用之后用eslint校验代码,但没有办法识html中js的代码,安装eslint-plugin-html -D识别html中的js代码
"plugins": [
"html"
],
//在json中配置script
"parser": "babel-eslint"//babel处理
}
"script": {
"lint": "eslint --ext .js .jsx .vue client/",
"lint-fix": "eslint --fix --ext .js .jsx .vue client/",
//fix自动修复
//每次修改代码会自动检查。安装eslint-loader babel-eslint -D添加parser属性在base.js中配置loader在rules中添加对象:
{
test: /\.(vue|js|jsx)$/,
loader: "eslint-loader",
esclude: /node_modules/,
enforce: "pre"//预处理,以上文件在使用vue-loader加载之前都会通过eslint-loader检测,post之后预处理。
}
}
editorConfig规范编辑器的配置
编译器插件,在编译器插件中自行安装
新建editorConfig,在不同的编辑器安装此插件,让不同的编辑器在使用这个项目编辑的时候使用相同的配置。
root = true//都当这个文件就行,不用往上层读
[*]//所有的文件规定规范
charset = utf-8
end_of_line = lf
indent_size = 2
index_style = space
insert_final_newline = true//保存文件末尾自动添加空行,eslint规范每个页面最后一行为空行
trim_trailing_whitespace = true//去掉多余的空格
precommit检测代码
git提交时,使用precommit插件,如果代码检查不符合eslint不能提交。git commit时自动调用precommit,检测代码。不通过,无法提交。
安装:husky包
npm install husky -D
会自动在项目文件下生成.githock文件,读取config文件中的内容,在srcipt添加脚本。
"precommit": "npm run lint-fix"
webpack的升级
卸载所有相关webpack及插件。
npm uninstall webpack webpack-dev-server webpack-merge -D
安装即可:
npm install webpack webpack-dev-server webpack-merge webpack-cli
webpack-cli 4以上在命令行启动的部分脚本在webpack-cli上。
其他的包也是卸载安装升级
@next没有发布的下一个包
修改配置:在base中添加mode
const config = {
mode: process.env.NODE_ENV || "production ",//development || "production",
}
client.js中修改,删掉CommonChunkPlugin
optimization: {
splitChunks: {
chunks: "all"//删除vender
},
runtimeChunk: true
}
//开发时的配置:
devtool
new webpack.NoEmitOnErrorsPlugin()
删除
webpack(构建一个前端项目)详解--升级的更多相关文章
- webpack(零工程构建一个前端项目)详解
工作流程记录: 1.初始化项目:npm init -y 2.安装webpack,vue,vue-loader npm install webpack vue vue-loader 3.按装之后根据警告 ...
- 使用gulp来构建一个前端项目
什么是gulp? gulp是一个前端项目构建工具,是自动化项目的构建利器,它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成.你可以使用gulp及其插件对你的项目代码 ...
- 用webpack构建一个常规项目,好处和坏处分析
最近项目改版,用webpack重新架构. 些许心得我会写几篇记录一下. 好处如下: 1.ES6语法用起来,babel-loader转义,各种新语法用起来. 2.import 语法写起来,webpack ...
- Linux上构建一个RADIUS服务器详解
作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息.但是网络设备通常只支持有限的用户管理功能.学习如何使用Linux上的一个外部RADIUS服务器来验证用户,具体来说是通过一个 ...
- 现代前端库开发指南系列(二):使用 webpack 构建一个库
前言 在前文中,我说过本系列文章的受众是在现代前端体系下能够熟练编写业务代码的同学,因此本文在介绍 webpack 配置时,仅提及构建一个库所特有的配置,其余配置请参考 webpack 官方文档. 输 ...
- eclipse里面构建maven项目详解(转载)
本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1 环境安装及分配 Maven是基于项目对象模 ...
- JAVA Eclipse使用Maven构建web项目详解(SSM框架)
tips: 启动项目后,welcome-file的链接即为测试用例 部署maven web项目 Eclipse使用Maven构建web项目详解 pom.xml添加webapp依赖: <depen ...
- [FE] 有效开展一个前端项目2 (vuejs-templates/webpack)
1.安装 nodejs.npm $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - $ sudo apt-get i ...
- webpack安装配置使用教程详解
webpack安装配置使用教程详解 www.111cn.net 更新:2015-09-01 编辑:swteen 来源:转载 本文章来为各位详细的介绍一下关于webpack安装配置使用教程吧,这篇文章对 ...
随机推荐
- ThinkPHP5.0最最最最最简单实例
ThinkPHP5.0最最最最最简单实例 一.效果图 二.操作步骤 1.用mysql数据库建立数据库 2.按照ThinkPHP官网的指示装好ThinkPHP5.0 tp5里面的目录结构如下: 3.配置 ...
- Fork and Join: Java Can Excel at Painless Parallel Programming Too!---转
原文地址:http://www.oracle.com/technetwork/articles/java/fork-join-422606.html Multicore processors are ...
- 准备把平台挪到linux
在上午准备周末胡老师的课程考核的Ppt时,逐渐我觉得不得不把平台挪到linux了.很多并行的应用不只是在linux上效率更高,而且很多包都在linux上.另外如果不及早挪到Linux上,后面遇到的问题 ...
- 一个PHPer如何深入学习ES搜索引擎?
公司早在一年前就上ES作为后端搜索服务的项目 ,我们PHPer只是负责实现业务接口,es的一些查询,优化技巧由另一组同事(JAVAer)负责,有时,一个需求过来,改动较大时,需要更改查询json语句, ...
- jquery动态表格,动态添加表格行
转载收藏于:https://www.cnblogs.com/zhangqs008/archive/2013/05/09/3618459.html 效果图: Html:<html> &l ...
- RabbitMq笔记()
RabbitMq 就是类似于一个数据库样式的操作工具. rabbit解释 有用户名登录密码之类的,还可以创建用户名,创建作用文件之类的. 2. 3.
- 理解 this.initialize.apply ( this, arguments )定义对象的一种方式
var Class = { create:function() { return function() { this.initialize.apply(this, arguments); }; } } ...
- 如何新建一个空的optix工程
参考链接 1.生成自定义里面添加cuda编译器 2. 修改这几个地方,设定cu文件需要的头文件.输出ptx文件的目录.生成ptx 这样就可以得到ptx了,注意ptx的路径即可 3.添加一些头文件.li ...
- CTSC2012 熟悉的文章 广义后缀自动机_单调队列
没啥难的,主要是单调队列忘了咋求了QAQ... Code: #include <cstdio> #include <algorithm> #include <cstrin ...
- [USACO4.2]完美的牛栏The Perfect Stall
题目:USACO Training 4.2(在官网上提交需加文件输入输出).洛谷P1894. 题目大意:有n头奶牛m个牛栏,每头牛只会在自己喜欢的牛栏里产奶,问一次最多有多少奶牛能产奶. 解题思路:二 ...