cnpm(node package manager)和webpack模块
npm是运行在node.js环境下的包管理工具(先安装node.js,再经过命令javascript
npm install npm -g
安装npm),使用npm能够很快速的安装前端文件里须要依赖的那些项目文件,好比js、css文件等。首先须要经过npm命令在根目录建立一个packg.json配置文件,这个文件定义了你的项目所须要的各类模块,以及项目的名称、版本、许可证等元数据、以json格式配置项目所需的运行和开发环境。cnpm是npm的淘宝镜像,cnpm的指令与npm是彻底同样的,把npm改成cnpm便可。php
安装packg.json配置文件
cnpm init -y //在根目录安装packg.json,y表示yes,将略过全部问答,所有采用默认配置。安装成功项目根目录会出现package.json
安装webpack
webpack的做用有两个css
1.能够能够将js、css等文件模块打包,会自动分析你的项目结构,找到这些模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),并将其打包为合适的格式以供浏html
览器使用。好比js文件并不能引用其余js文件,除非使用ES6的语法import,这种语法如今不少浏览器并不支持,webpack能够对其转换打包成一个能够被浏览器解析的文件。前端
2.一个html页面上的link、javascript和img等标签老是会默认发起ajax请求向服务器索要html依赖的各类程序文件和图片、字体图标,这会形成页面加载速度不够理想。使用webpack后,由webpack统一管理这些耗时的每次请求,你不须要在每一个html页面上引入那些繁多的程序文件、图片和字体图标,只须要引入同一个文件(装载了js、css等的引用)就能够解决全部引入的问题,这节约了页面加载的耗时。vue
3.打开命令行工具,不管是在何处打开命令行工具的,你只须要输入安装webpack的命令便可把webpack安装到全局(C:\Users\Andminster\AppData\Roaming\npm目录下)java

cnpm i webpack-cli -g cnpm i webpack -g
cnpm uninstall -g webpack

package.json
在你的项目根目录建立package.json文件。这个文件里就是你的项目所须要的各类模块,它配置项目的开发环境。.json的文件里不能写注释,不能使用单引号。node
{
"name": "vue",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jquery": "^3.4.1", //运行程序依赖于jquery,因此下载jquery时使用的是cnpm i jquery -S,S就是保存到运行环境
"webpack-cli": "^3.3.2"
},
"devDependencies": {
"webpack": "^4.31.0", //webpack等打包工具只是用来打包的时候用 ,运行发生在打包以后,因此打包工具放在生产环境里
//cnpm i webpack -D ,D就是保存到生产环境里。若是不写-S或-D则默认为-D
"webpack-dev-server": "^3.3.1"
}
}
指令的四种模式
cnpm i xxxmodule 安装到本地node_modules目录(即你vue项目目录,不是全局的C:\Users\Andminster\AppData\Roaming\npm\node_modules目录)
cnpm i xxxmodule - D 安装到本地目录后注册到package.json的devDependencies(dev)生产环境中,生产环境的程序是用来编译打包的
cnpm i xxxmodule - S 安装到本地目录后注册到package.json的dependencies(dep)运行环境中,运行环境是用来支持运行时的程序的
cnpm i xxxmodule -g global(全局安装),安装到C:\Users\Andminster\AppData\Roaming\npm,而不是安装到你的项目目录
webpack打包指令
webpack .\src\main.js .\dist\bundle.js
新版命令:webpack .\src\main.js -o .\dist\bundle.js
webpack手动打包
在vscode中,建立以下目录和文件jquery

打开终端输入cnpm指令webpack
1.cnpm init -y 安装packge.json
2.cnpm i webpack-cli -g 安装全局的webpack CLI
3.cnpm i webpack -g 安装全局的webpack
4.接下来在main.js中输入一段测试代码,打开浏览器测试效果
浏览器不识别ES6的语法格式,因此须要用webpack对此文件进行转换,转换结果在dist/bundle.js里
import $ from "jquery"
$(function() {
alert("hello");
});
webpack .\src\main.js .\dist\bundle.js,若是你用的最新版本:webpack .\src\main.js -o .\dist\bundle.js
<script src="../dist/bundle.js"></script>
webpack.config.js
如不喜欢每次转换都提供入口和出口文件路径,能够考虑在项目根目录建立一个webpack.config.js文件,将入口和出口路径配置在该文件中。这样,下次打包时只须要输入webpack便可。
const path=require("path");
module.exports={
entry:path.join(__dirname,"/src/main.js"),
output:{
path:path.join(__dirname,"/dist"),
filename:"bundle.js"
}
}
webpack-dev-server模块(自动打包)
在熟悉了webpack安装及其使用方式后,如今你能够彻底忽略以上的打包方法。如下介绍的方法是终极绝招,请把上面的方法忘掉,自动打包方法能够自动监视你对程序的修改且能够将改动即时反应在浏览器上。也即,你不须要手动写转换打包的指令,连webpack指令也不须要写。具体操做以下
1.cnpm init -y 安装packge.json
2.cnpm i webpack-cli -g 安装全局的webpack CLI
3.cnpm i webpack -g 安装全局的webpack
4.cnpm i webpack-cli -D 安装本地(当前项目)的webpack CLI到生产环境
5.cnpm i webpack -D 安装本地(当前项目)的webpack到生产环境
6. cnpm i webpack-dev-server -D 安装本地的webpack-dev-server到生产环境
7.在package.json文件中的scripts属性中添加一条
{
"name": "vue",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jquery": "^3.4.1",
"webpack-cli": "^3.3.2"
},
"devDependencies": {
"webpack": "^4.31.0",
"webpack-dev-server": "^3.3.1"
}
}
8.在当前项目的根目录建立webpack.config.js,添加如下代码
const path=require("path");
module.exports={
entry:path.join(__dirname,"./src/main.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
}
}
9.在index.html中引入还未打包的bundle.js,这个文件通过webpack-dev-server自动处理后会生成到内存中,而再也不是dist目录
<script src="/bundle.js"></script>
10.执行cnpm run dev(终止cnpm run dev:在命令窗口按ctrl+c),输出如下信息

在浏览器输入http://localhost:8080打开网站点击src目录下的index.html文件查看效果。如今你对项目的js文件改动后,webpack-dev-server会当即做出响应并反映在浏览器上。

托管站点根目录
有两种方式能够托管站点根目录,第一种是经过在package.json的scripts中为dev指定参数来设置托管的根目录,被托管的目录会被当作站点根目录:
"dev": "webpack-dev-server --open"
"dev": "webpack-dev-server --open --port 3000" //自定义端口号
"dev": "webpack-dev-server --open --contentBase src" //自定义托管的站点根目录,这会致使cnpm run dev时自动打开托管目录下默认的index.html
"dev": "webpack-dev-server --open --hot" //热重载,每次改动时不会从新生成一个bundle.js,而是将局部修改的代码反映在已经生成过的bundle.js中,这样作会使当你改动js代码后浏览器当即刷新(刷新按钮有反映)才会呈现改动后的结果,使用hot时只有css不会刷新页面
第二种方式是经过在webpack.config.js的devServer中指定参数来设置托管的根目录,被托管的目录会被当作站点根目录
const path=require("path");
module.exports={
entry:path.join(__dirname,"./src/main.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
},
devServer:{
open:true,
hot:true,
port:3000,
contentBase:"src" //托管的站点根目录设为src而再也不是项目根目录(本例中项目根目录是vue,src在vue下面)
}
}
引用node_module目录下的程序包
无论你托管的目录是vue(本页面例子中的根目录)仍是托管的vue下面的src目录,在引用经过cnpm指令安装的程序包(jquery、bootstrap等文件)时,jquery、bootstrap自己是在node-module目录,若是你的站点根目录是src,也不用担忧没法引入与src同级别的node-module目录下的文件。也即无论托管哪一个目录,都是使用如下方式引入node-module目录下的包,都会去node-module去找,不用手动写/node-module/bootstrap……
import $ from "jquery" import "bootstrap/dist/css/bootstrap.css"
css打包
webpack默认值支持js文件的打包,要打包css须要安装专门处理css的loader模块
1.cnpm i style-loader -D 本地安装style-loader模块
2.cnpm i css-loader -D 本地安装css-loader模块
3.在webpack.config.js中注册模块
const path=require("path");
module.exports={
entry:path.join(__dirname,"./src/main.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
},
devServer:{
open:true,
hot:true,
port:3000,
contentBase:"src"
},
module:{
rules:[
{test: /\.css$/,use:['style-loader','css-loader'] }
]
}
}
4.在src目录建立css目录,在css目录建立index.css
#box{
font-size:150px;
color:red;
font-weight:bold;
}
5.在src目录的main.js文件中添加如下引入css文件的代码
import $ from "jquery" //jquery安装在本地
import "./css/index.css" //其中./表示当前目录,不能直接写css/index.css,不然报错
$(function() {
alert("webpack");
});
6.在src目录的index.html中添加以下代码
<div id="box">webpack</div>
最后运行cnpm run dev看效果

处理css文件中的url
#box3{
background: url('/img/1.PNG') ;
height:200px;
}
webpack不能处理url地址,这些url地址指向了图片、字体等。这须要安装url-loader来处理,而url-loader又依赖于file-loader
1.cnpm i file-loader -D
2.cnpm i url-loader -D
3. 注意你的webpack托管的是哪个目录,如今假设你的图片路径为:vue/src/img/1.png。那么若是你的托管的根目录是你的项目根目录vue,则你在css文件中的url为:/src/img/1.png。若是你把src设为站点根目录,好比你把在webpack.config.js文件中的devServer属性的contentBase设src为托管目录,而你的项目根目录原本是vue,那么你在css文件中设置的url为:img/1.png
在webpack.config.js注册url-loader
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.(png | jpg | gif | ttf | jpeg)$/, use: 'url-loader' }
]
}
url-loader默认不会把图片生成为base64的编码,但base64编码有利于网络传输,通常状况下应该将小图片转换为base64,大图不适用。可经过配置module的rules来实现自动识别小图并转换
{ test: /\.(png|jpg|gif|ttf)$/, use: 'url-loader?limit=2742' } <2742字节会被转换,经测试无效,缘由不明
处理字体图标
好比bootstrap、阿里的iconfont等就有不少字体图标,须要设置过滤规则,用url-loader进行处理
{ test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
打包less
与css是同样的设置方式,先在src-css目录建立index.less文件
#box2{
p{
font-size:50px;
background: "#000";
color:red;
}
}
在main.js引入less
import "./css/index.less"
在webpack.config.js注册less-loader
module:{
rules:[
{test: /\.css$/,use:['style-loader','css-loader'] }, {test: /\.less$/,use:['style-loader','css-loader','less-loader']} //以less结尾的文件用这两模块进行处理
]
}
cnpm i less -D 本地安装less,less-loader模块依赖于less模块
cnpm i less-loader -D 本地安装less-loader模块
打包sass
第一种方法
npm i -global node-gyp
npm i -global -production windows-build-tools
cnpm i node-sass -D
cnpm i sass-loader -D
其中node-gyp和production windows-build-tools须要用管理员身份运行powershell,因为这两个工具包都是全局安装,因此随便在哪一个位置打开powershell均可以,使用npm安装这两个工具,安装完成后,再shift加右键项目目录打开powershell安装node-sass和sass-loader。若是以前没有安装gyp和windows构建工具致使失败,必定要先卸载sass相关包,再按本方法从新安装。
第二种方法(没试过,不肯定可行与否)
npm i --save node-sass --registry=https:
npm sass-loader -d
配置第三方模块的加载器
module:{
rules:[
{test: /\.scss$/,use:['style-loader','css-loader','sass-loader']}
]
}
全局引入scss(vue-cil + webpack适用)
若是你不但愿在.vue组件文件中导入scss(由于每个组件文件可能都须要用到某个全局的scss文件,这样导入会下降效率,并且组件文件也有深度层级,这样每一个组件文件都导入某个全局的scss文件就得琢磨路径问题,超麻烦。但若是你不把某个全局的scss文件导入到当前.vue组件文件中,则没法使用全局scss文件中的变量)。这个问题靠安装sass-resources-loader来解决。注意如下各类支持sass的包须要同时保存到生产环境和运行环境
cnpm i node-sass -S -D
cnpm i sass-loader -S -D
cnpm i style-loader -S -D
cnpm i sass-resources-loader -S -D
打开build/webpack.base.conf.js,添加scss处理程序(loader)
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
打开build/utils.js,找到scss一行
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
替换为
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders( 'sass' ).concat(
{
loader: 'sass-resources-loader',
options: {
resources: path.resolve( __dirname, '../src/assets/css/global.scss' )
}
}
),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
resources指定了你的全局scss的路径:css/global.scss,你须要在../src/assets目录中建立一个css目录,在css目录建立一个global.scss文件做为全局scss文件

而后在global.scss中定义一个变量
如今你能够在任何一个.vue组件文件中的style标签里加入lang="scss",接着就可使用全局变量了。
<style scoped lang="scss">
h1, h2 {
font-weight: normal;
background:$bgcolor;
}
</style>
打包js文件
webpack只支持一些不算过高级的ES6语法,要完整支持ES6高级语法,须要安装babel-loader,有babel-loader是一个js高级语法编译器,它处理以后会自动交给webpack打包到bundle.js
1.cnpm i babel-core babel-loader@7.1.5 babel-plugin-transform-runtime -D
2.cnpm i babel-preset-env babel-preset-stage-0 -D
注:babel-loader必须是7.1.5,其它版本装了报错。
在webpack.config.js注册babel-loader
module: {
rules: [
{ test: /\.js$/, use: 'babel-loader',exclude:/node_modules/ } //exclude设置被babel-loader编译所排除的目录,若是这个目录被转换,耗时很长并且不能成功运行
]
}
在项目根目录(与package.json同级)建立一个.babelrc的json文件(注:文件名起始处带.号,不带json后缀名)用于注册babel-loader所使用的插件和语法

{
"presets":["env","stage-0"],
"plugins":["transform-runtime"]
}
在main.js中写测试代码
class Person{
static personCount=100;
}
alert(Person.personCount);
import时的路径提示工具
安装扩展工具:Path Intellisense后,在设置种打开json配置输入如下红色部分的代码
{
"editor.renderLineHighlight": "gutter",
"editor.mouseWheelZoom": true,
"path-intellisense.mappings": {
"@": "${workspaceRoot}/src"
}
}
在项目根目录下建立jsconfig.json,该文件与package.json同级
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": [
"node_modules"
]
}

安装vue-cil
vue-cil自带完整的目录结构,先装package.json、再装webpack-cil、webpack,最后安装vue-cil
1.npm install --global vue-cli
2.安装好后,在C:\Users\Andminster\AppData\Roaming\npm下的node_modules目录下会看到vue-cil
3.建立一个目录,shift右键该目录打开命令行工具,输入:vue init webpack 你准备建立的项目名称(不能有大写字母),接下来会弹出一些提示如图所示,一路回车或yes or no以后,vue-cil会自动为你在你建立的目录下面建立一个完整的vue项目目录。

若是是在visual studio中使用vue项目,因为vue-cil已经完整建立了项目结构,因此只须要在vs中:文件-打开-网站,选择你的项目目录便可把项目载入到vs中

自动打开网站
打开package.json文件,为webpack-dev-server增长:--open --hot。
运行
一切就绪以后,关掉命令行工具,再shift右击项目目录(是vue-cil自动建立的,不是你手动建立的目录)运行npm run dev,由于安装vue-cil是在项目目录的上级目录开始的,此时不退出你运行vue项目,会提示找不到文件。
cannot get
若是打开网站后提示cannot get,多是没有安装sass处理包,sass安装参考:全局引入scss(vue-cil + webpack适用)
webpack.base.conf.js
此文件就是配置处理各类文件的loader的地方。 默认状况下不须要改动。
关闭浏览器控制台eslint对错误的提示

打开config目录下的index.js,将useEslint设为false
vue.config.js
这个文件位于与package.json相同的目录,默认没有建立,你能够自行建立,它会在终端运行 vue-cli-service 时,先找到vue.config.js,获取到你的相关配置,才继续执行其它操做,具体配置结构以下,可直接复制粘贴到vue.config.js中。

module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '//your_url'
: '/',
outputDir: 'dist',
assetsDir: 'static',
indexPath: 'index.html',
filenameHashing: true,
pages: {
index: {
entry: 'src/pages/index/index.js',
template: 'src/pages/index/index.html',
filename: 'index.html',
title: '首页',
chunks: ['chunk-vendors', 'chunk-common', 'index']
},
},
lintOnSave: true,
runtimeCompiler: false,
transpileDependencies: [],
productionSourceMap: false,
crossorigin: undefined,
integrity: false,
configureWebpack: {
plugins: [
new MyAwesomeWebpackPlugin()
]
},
chainWebpack: ( config ) => {
config.optimization
.splitChunks( {
cacheGroups: {}
} );
config.module
.rule( 'eslint' )
.exclude
.add( '/Users/maybexia/Downloads/FE/community_built-in/src/lib' )
.end()
},
css: {
modules: false,
extract: true,
sourceMap: false,
loaderOptions: {
css: {
},
postcss: {
}
}
},
devServer: {
open: true,
host: '127.0.0.1',
port: 3000,
https: false,
hotOnly: false,
proxy: null,
before: app => {
}
},
parallel: require( 'os' ).cpus().length > 1,
pwa: {},
pluginOptions: {}
};
vue.config.js
关于vue-cil其它参考:Vue2全家桶之一:vue-cli(vue脚手架)超详细教程
经常使用指令
cls //清除控制台信息
ctrl + c //终止控制台程序的执行
cnpm info 包名//查看远程包的版本号
vue 包名 -V //查看本地包版本号
cnpm uninstall 包名 //卸载包
其它
*处理工具xxx-loder在webpack1.0版本不须要后缀loader
* 若是项目运行失败的错误是端口号问题,多是端口号被占用,关闭vscode从新打开或打开windows资源管理器,结束进程便可
Javascript - 学习总目录