webpack(零工程构建一个前端项目)详解
工作流程记录:
1.初始化项目:npm init -y
2.安装webpack,vue,vue-loader
npm install webpack vue vue-loader
3.按装之后根据警告提示,安装css-loader,vue-template-conpiler依赖包。
npm install css-loader vue-template-compiler
项目初始化基本完成。
一直遇到提示 install webpack-cli -D,即使安装了也没有用,索性直接删除了,之后可以使用。
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"build": "webpack --config webpack.config.js"
只有在这里面写webpack他才会调用这里面的webpack,否则会调用全局的webpack,会导致很多版本不同出错
},
4.新建webpack.config.js
const path = require("path");//nodejs中的基本包,处理路径的
module.exports = {
entry: path.join(__dirname,"src/main.js"),//__dirname代表文件所在的目录
output: {
filename: "bundle.js",
path: path.join(__dirname,"dist")
}
}
5.新建src文件,源代码
src下新建app.vue
<template>
<div id="text">{{text}}</div>
</template>
<script>
export default {
data() {//数据
return {
text: "abc"
};
}
}
</script>
<style>
#text{color: red;}
</style>
src下新建main.js
import Vue from "vue";
import App from "./app.vue";//.vue文件
//分别导进来文件
//创建根文件
const root = document.creatElement("div");
document.body.appendChild(root);
new Vue({
render: (h) => h(App)//通过它挂载到html页面中
}).$mount(root);//挂载到html页面中
6.按需要添加loader
module.exports = {
entry: path.join(__dirname,"src/main.js"),//__dirname代表文件所在的目录
output: {
filename: "bundle.js",
path: path.join(__dirname,"dist")
},
module: {
rules: [
{
test: /\.vue$/,
loader: "vue-loader"
},
{
test:/\.styl/,//stylus预处理
use: [
"style-loader",
"css-loader",
"stylus-loader"//专门处理stylus文件,处理完成之后让css-loader处理css,扔给上一层处理,自己处理自己。比较方面,可以不用写任意的括弧,标点符号。兼容css==== npm install stylus-loader stylus
]
},
{
test: /\.css$/,
use: [
"style-loader",
"css-loader"
]
},
{
test: /\.(gif|jpg|jpeg|png|svg)$/,
use: [
{
loader: "url-loader",//的安装依赖file-loader
options: {
limit: 1024,//如果文件小于1024就会把图片转译成base64的代码
name: "[name]-aa.[ext]"//指定输出的名字,[name].[ext],原来的名字.扩展名,-aa是自定义的=====之后把相应的loader安装即可。
}
}
]
}
]
}
}
webpack做的事情就是把不同的静态资源类型打包成一个js,在html中引用js,在html引用js即可。把零碎的js打包在一起减少http请求。使用模块依赖,这样积累,以后的项目可以复用。
7.在main.js中导入所需要的js,css,图片等模块。
import Vue from "vue";
import App from "./app.vue";//.vue文件
import "./assert/style/style.css";
import "./assert/img/123.jpg";
...
8.配置webpack-dev-server
安装:
npm install webpack-dev-server
安装之后在package.json中设置
"scripts": {
"dev": "webpack-dev-server --config webpack.config.js"
}
在webpack.config.js中全局的配置。
module.exports = {
target: "web",//编译目标是web平台
entry: "..."
}
//判断那个环境
//安装一个cross-env,不同的平台上运行的环境变量不一样。
"build": "cross-env NODE_ENV=production webpack --config webpack.config.js",//windows: set NODE_ENV=production
"dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js"
"dev": "cross-env NODE_ENV=development webpack-dev-server --mode development --config webpack.config.js"//解决热跟新是保存页面多次插入模板
在webpack.config.js中判断:
const isDev = process.env.NODE_ENV === "development";//判断是不是develment,在里面设置的环境变量都在process.env这个对象里
const config = {
target: "web",//编译目标是web平台
entry: "..."
}
if(isDev) {
config.devServer = {//给config添加一个对象。server是webpack2.0
port: "8000",
host: "0.0.0.0",//可以通过localhost,127.0.0.1,访问,也可以手机测试,其他本机内网也可以访问。
overlay: {
errors: true,//编译时出现错误显示
},
//热加载hot,需要webpack的HotModuleReplacementPlugin插件
hot: true//修改了一个组件的代码,至渲染组件的数据,不会整个页面刷新,安装插件
},
config.plugins.push(
new webpack.HotModuleReplacementPlugin(),//启动这个插件,热加载
new webpack.NoEmitOnErrorsPlugin()
),
config.devtool = "#cheap-module-eval-source-map"//映射编译后的代码,(.vue,es6代码映射成浏览器识别的代码)
}
module.exports = config;//整体的暴露出去
9.安装html插件
html-webpack-plugin
webpack.config.js中全局引用:
const HTMLPlugin = require("html-webpack-plugin");
const webpack = require("webpack");
//在config对象中添加
plugins: [
new webpack.DefinePlugin({//自身自带的一个插件
"process.env": {//判断是哪一个环境,开发环境还是生产环境
NODE_ENV:isDev ? " 'development' " : " 'production' "//判断环境
}
}),
new HTMLPlugin();//new 就可以了
]
安装postcss-loader autoprefixer babel-loader babel-core
安装之后新建.babelrc,postcss.config.js
postcss.config.js:
const autoprefixer = require("autoprefixer");
module.exports = {
plugins: [
autoprefixer()
]
}
//后处理css,通过次组建处理css,处理浏览器前缀的等。
babelrc:
安装babel-preset-env babel-plugin-transform-vue-jsx
{
"presets": [
"env"
],
"plugins": [
"transform-vue-jsx"//专门转化vue中的js
]
}
//如何使用jxs代码的识别,
在插件中添加rules
{
test: /\.jsx$/,
loader: "babel-loader"
}
//需要在css-loader中添加一个对象
{
"css-loader",
{
loader: "postcss-loader",
options: {
sourceMap: true
}
},//stylus-loader会自动生成sourse map,postcss-loader也会自动生成,这样前面的生成后后面的在不生成,使用效率会很好。使用效率会很好。
"stylus-loader"
}
.jsx文件
import "../.css";
export default {
data() {
return {
author: "intelwisd"
}
},
render() {
//可以使用一些js业务操作
return (//返回标签
<div>{this.author}</div>
);
}
}
使用导入组件相同。
webpack正式环境打包的优化
把css单独的打包出来,安装extract-text-webpack-plugin
webpack.config.js:导入使用
const ExtractPlugin = require("extract-text-webpack-plugin");//非js打包成一个静态文件,做浏览器缓存
//根据不同的环境去添加css
if(isDev) {//开发时使用styl
config.module.rules.push({
test: /\.styl/,
use:[
"style-loader",
"css-loader",
{
loader: "postcss-loader",
options: {
sourceMap: true
}
},
'stylus-loader'
]
});
}else{//线上时使用把css单独打包成静态文件
config.module.rules.push({
test: /\.styl/,
use: ExtractPlugin.extract({
fallback: "style-loader",
use: [
"css-loader",
{
loader: "postcss-loader",
options: {
sourceMap: true
}
},
"stylus-loader"
]
})
}),
config.plugins.push(
new ExtractPlugin("styles.[contentHash:8].css")
),
config.output.filename = "[name].[chunkhash:8].js"
//接着处理filename
}
filename: "bundle.[hash:8].js"//默认的
vue-loader会根据每个组件里面的样式显示的时候才会显示到页面上,好处是使用组件异步加载的时候css跟着异步加载,会省很多流量。
单独打包库代码以至于缓存
else{//线上环境
config.entry = {//entry路径下添加打包的库文件
app: path.join(__dirname,"src/index.js"),
vendor: ["vue","vue-router"]
},
config.plugin.push({//利用此插件
new webpack.optimize.CommonsChunkPlugin({
name: "vender"//库文件打包成的名字
}),//这两者是有顺序的
new webpack.optimize.CommonsChunkPlugin({
name: "runtime"//webpack相关的文件打包到包度的文件中,好处:有新的模块时,webpack会添加一个新的id上去,就会导致打包时hash发生变化,会阻止浏览器的长缓存。
})
})
}
hash和chunkhash
chunkhash: 在entry中生成的不同的节点,不然打都打包没有意义。线上环境必须用chunkhash。
hash: 所有打包出来的模块都是同一个哈希,整个应用的hash
https://github.com/Wunworld/myWebpack1
webpack(零工程构建一个前端项目)详解的更多相关文章
- webpack(构建一个前端项目)详解--升级
升级一个正式的项目结构 分离webpack.config.js文件: 新建一个webpack.config.base.js任何环境依赖的wbpack //public webpack const pa ...
- 使用gulp来构建一个前端项目
什么是gulp? gulp是一个前端项目构建工具,是自动化项目的构建利器,它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成.你可以使用gulp及其插件对你的项目代码 ...
- Linux上构建一个RADIUS服务器详解
作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息.但是网络设备通常只支持有限的用户管理功能.学习如何使用Linux上的一个外部RADIUS服务器来验证用户,具体来说是通过一个 ...
- [front]有效开展一个前端项目
今天的前端如果没有用到 npm,效率是比较低的:所以要从使用的工具来讲. 1. 一切都依赖于 nodejs: 下载一个 linux 的源码包就可以开始安装了. $ wget https://nodej ...
- [FE] 有效开展一个前端项目1
今天的前端如果没有用到 npm,效率是比较低的:所以要从使用的工具来讲. 1. 一切都依赖于 nodejs: 下载一个 linux 的源码包就可以开始安装了. $ wget https://nodej ...
- [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工具学习 构建简单vue项目(不依赖vue-cli) webpack4.0
目的用webpack构建简单前端项目 1.npm init (npm init -y) 形成package.json 2.npm install --save-dev webpack 形成 n ...
- eclipse里面构建maven项目详解(转载)
本文来源于:http://my.oschina.net/u/1540325/blog/548530 eclipse里面构建maven项目详解 1 环境安装及分配 Maven是基于项目对象模 ...
- 利用 vue-cli 构建一个 Vue 项目
一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...
随机推荐
- linux 内存不足时候 应该及时回收page cache
另一起问题是24G内存的系统,空闲内存已经不到50M 1. 确认该系统的版本是64位 # uname -a Linux gxgd-nms-app 2.6.18-194.el5xen #1 SMP Tu ...
- [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)
题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...
- swift语言点评二十-扩展
结论:扩展无法修改原来的数据结构. Extensions can add new functionality to a type, but they cannot override existing ...
- P2421 [NOI2002]荒岛野人 扩展欧几里得 枚举
Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- [agc004c]and grid
别问我为什么咕了两天 题意: 给出一个$H\times W$的网格图A,仅由'.'和'#'构成,边界上没有'#'且至少有一个'#'.构造两个网格图B和C,大小均为$H\times W$,要求A中为'# ...
- [ZJOI2015]幻想乡战略游戏(点分树)
题意自己看... 思路 没想到今(昨)天刷着刷着点分治的水题,就刷出来了一个点分树... 然后就疯狂地找题解,代码,最后终于把它给弄懂了. 点分树——动态点分治,对于此题来说,我们设u为当前的补给站位 ...
- vi 学习记录
i 光标所在前插入 I 光标所在行的第一个非空字符前进入输入模式 a 光标所在后插入 A 光标所在最后插入 o 光标所在列下新增一列并进入输入模式 O 光标所在列上新增一列并进入输入模式 退出 :q, ...
- redhat 7 cenos 7 网络配置文件
Cenos 7 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no DEFROUTE=yes IPV4_FAILURE_FATAL=no NAME=eth0 ...
- 使用systemctl自定义系统服务
1.创建系统服务文件,格式如下: [Unit] Description=httpd After=network.target [Service] Type=forking ExecStart=/usr ...
- 制作PC端的安装程序
一个多月不写博客了,不造大家有没有想我,(别自恋了,寥寥无几的粉丝,谁会想你),呜呜~~~ 好了,废话少叙,借用郭德纲老板的话,天儿不早了,干点正事儿吧! 一.序 Unity开发者都知道,打包出来的e ...