Vue webpack 介绍 翻译

懵逼,竟然没有中文版。自己对英文不敏感,看一遍记录下来,备用。

介绍

这个模板是针对大型应用,默认你已经熟悉Webpackvue-loader。确定已经读过vue-loader文档去面对一般的工作流程。

快速开始

为了使用这个模板,需要使用vue-cli脚手架。推荐使用npm3+

$ npm install -g vue-cli
$ vue init webpack my-project
$ cd my-project
$ npm install
$ npm run dev

项目结构

.
├── build/                      # webpack config files(webpack配置文件)
│   └── ...
├── config/
│   ├── index.js                # main project config(主要配置文件)
│   └── ...
├── src/
│   ├── main.js                 # app entry file(入口)
│   ├── App.vue                 # main app component(组件入口)
│   ├── components/             # ui components
│   │   └── ...
│   └── assets/                 # module assets (processed by webpack)(需要预处理的静态资源)
│       └── ...
├── static/                     # pure static assets (directly copied)(纯静态资源)
├── test/(测试先不看了)
│   └── unit/                   # unit tests
│   │   ├── specs/              # test spec files
│   │   ├── eslintrc            # config file for eslint with extra settings only for unit tests
│   │   ├── index.js            # test build entry file
│   │   ├── jest.conf.js        # Config file when using Jest for unit tests
│   │   └── karma.conf.js       # test runner config file when using Karma for unit tests
│   │   ├── setup.js            # file that runs before Jest runs your unit tests
│   └── e2e/                    # e2e tests
│   │   ├── specs/              # test spec files
│   │   ├── custom-assertions/  # custom assertions for e2e tests
│   │   ├── runner.js           # test runner script
│   │   └── nightwatch.conf.js  # test runner config file
├── .babelrc                    # babel config(es6适配)
├── .editorconfig               # indentation, spaces/tabs and similar settings for your editor
├── .eslintrc.js                # eslint config
├── .eslintignore               # eslint ignore rules
├── .gitignore                  # sensible defaults for gitignore
├── .postcssrc.js               # postcss config
├── index.html                  # index.html template
├── package.json                # build scripts and dependencies
└── README.md                   # Default README file

build/
这个目录包含生产和开发环境下的webpack构建配置。通常情况下你不需要接触这些文件,除非你想自定义webpack构建。在这种情况下,你需要去浏览build/webpack.base.conf.js
config/index.js
这个是一个暴露了在在build过程中大部分配置选项的配置文件。See API Proxying During Development and Integrating with Backend Framework for more details.
src/
项目代码目录。如果使用了Vuex可以参考recommendations for Vuex applications.
static/
不需要预处理的静态资源文件
See Handling Static Assets for more details.
test/unit
测试文件
See Unit Testing for more details.
test/e2e
e2e测试文件
See End-to-end Testing for more details.
index.html
这个单页面模板。在开发和构建中。webpack 最后生成的资源的都在注入到这个模板。生成最后的html
package.json
包含依赖的npm包文件和build指令

Build 指令

所有执行都是NPM脚本执行
npm run dev
开启node.js本地服务器

  • 单页面组件需要的webpack + vue-loader
  • 热加载(修改文件,无需重启服务器)
  • 编译覆盖
  • ESlint
  • 原文件映射
    npm run build
    为生产构建资源文件
  • js压缩( UglifyJS v3.)
  • html压缩html-minifier.
  • 所有组件中的css文件被提取到一个文件中,压缩cssnano.
  • 为了长期缓存素有的静态资源都被编译带有版本哈希。生产模式下的index.html会自动生成url为这些资源
    npm run unit
    利用Jest在JSDOM中进行单元测试
  • 支持es6
  • 容易mocking
    npm run e2e
    利用nightWatch进行e2e测试。
  • 在多个浏览器进行并行测试
  • 开箱即用的命令
    • Selenium and chromedriver dependencies自动处理
    • 自动生成Selenium服务器。
      npm run lint
      运行eslint

Babel 配置

这个模板使用了babel-preset-env来配置babel,更多信息参考http://2ality.com/2017/02/babel-preset-env.html.
一个预选设置的Babel可以自动将es6降级为es5,根据目标浏览器或者运行环境
使用browserslist
去压缩这些信息所以我们可以使用valid query format supported by browserslist.
然后这里有个警告,browserslist推荐定义目标文件类似package.json或者. browserslistrc配置文件。这样允许一些工具,类似 autoprefixer and eslint-plugin-compat 去分享这些配置,在这个模板中browserslist配置在package.json:

{
  "...": "...",
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

但在最新的babel-preset-envv1.6.1稳定发行版中。没有支持加载配置文件从package.json,所以配置环境重复在.babelrc.如果你希望改变你的目标环境,请确定更新了package.json. babelrc。这个问题已经在测试版修正。模板会在正式版出来更新。

Linter配置

这个模板利用ESLinter作为linter,使用标准的预设和一些自定义操作。
如果你不喜欢这些预定的规则,你有已下几种选择。
1。在.eslintrc.js中重写linter规则。例如你可以强制使用分号而不是忽略他们:

// .eslintrc.js
"semi": [2, "always"]
  1. 当生成项目的时候,选择一个不同的预设。例如eslint-config-airbnb.
    3 当生成项目定义自己的规则的时候,对于ESLinter选择none。更多细节See ESLint documentation for more details.

修正Linter错误

你可以使用以下命令去修复错误(不能修复所有的错误)

npm run lint -- --fix

在中间的--是有必要的确定--fix是传给lint 而不是npm的
该模板为大多数CSS预处理器预先配置了CSS提取。要使用预处理器,只需要安装相应的webpack加载程序。例如SASS

npm install sass-loader node-sass --save-dev

你需要安装node-sass因为sass-loader依赖他

在组件中中使用预处理器

一旦你安装了预处理器,你可以在.vue 中使用style标签的lang属性

<style lang="scss">
/* write SASS! */
</style>

一个SASS语法的提示

lang =“scss”对应于CSS超集语法(带花括号和分号)。
lang =“sass”对应于基于缩进的语法。

PostCss

  • .vue文件和样式文件(* .css,* .scss等)中的样式默认被PostCss输出。你不要使用特定的加载器
    你可以简单的增加PostCss插件,通过在根目录添加.postcssrc.js
// https://github.com/michael-ciniawsky/postcss-load-config

module.exports = {
  "plugins": {
    // to edit target browsers: use "browserslist" field in package.json
    "postcss-import": {},
    "autoprefixer": {}
  }
}

See vue-loader's related documentation for more details.

独立的CSS文件

为了确保提取和处理的一致性。推荐你导入全局,独立的样式在App.vue组件中。例如

<!-- App.vue -->
<style src="./styles/global.less" lang="less"></style>

在程序中你应该只对自己写的样式这样操作。对于已经存在的库 e.g. Bootstrap or Semantic UI你可以放在index.html并且引入他们。这样避免构建时间和浏览器缓存

处理静态Assets

你应该在注意到在项目结构总有2个静态资源文件夹src/assetsstatic/.区别是什么呢?

Webpacked Assets

为了回答这个问题,我们要知道Webpack如何处理这些assets,在*.vue的组件中。你的所有模板和css样式都被vue-html-loader and css-loader解析以查找资源urls。
举例<img src="./logo.png"> and background: url(./logo.png), "./logo.png"是相对资源路径会被webpack作为模块依赖性解决。

因为logo.png不是js,当作为模块依赖性对待的时候,我们需要使用url-loader and file-loader去处理。这个模板,已经配置了这些loaders。你可以免费获得如filename fingerprinting和 base64内联功能,当你使用相对路径的时候不用考虑部署问题。

由于这些资产可能在构建过程中被内联/复制/重命名,因此它们基本上是源代码的一部分。这就是为什么建议将Webpack处理的静态资源放置在/ src中以及其他源文件的原因。 实际上,你甚至不必将它们全部放在/ src / assets中:您可以使用它们根据模块/组件组织它们。 例如,您可以将每个组件放在其自己的目录中,其静态assets就位于其旁边。

Asset 解析规则

1 urls 相对路径:类似./assets/logo.png会被解释成模块依赖,会被替换成由webpack基于你输出配置的自动生成的url路径
2 没有前缀的urls 类似assets/logo.png等同于./assets/logo.png
3 带有~前缀的urls : 会被作为一个模块请求,类似require('some-module/image.png'),如果你想利用Webpack模块解析配置,你需要使用这个前缀
4 根目录相对路径。 不会被处理

在js中获取Asset路径

为了在webpack中返回正确的路径,你需要使用require('./relative/path/to/file.jpg')
,这会被file-loader处理并且返回解析后的路径 例如:

computed: {
  background () {
    return require('./bgs/' + this.id + '.jpg')
  }
}

注释: 例子中的图片在最后的build中都会在./bgs/。因为webpack无法猜测在运行是什么时候时候使用到。

真正静态资源

作为对比,在static/不会被webapck处理.他们会被直接复制并且相同的文件名。你必须使用他们用绝对路径。这个绝对路径是这是通过在config.js中加入build.assetsPublicPath和build.assetsSubDirectory来确定的

// config/index.js
module.exports = {
  // ...
  build: {
    assetsPublicPath: '/',
    assetsSubDirectory: 'static'
  }
}

所有放在static/文件加下面的文件必须使用绝对路径static/filename。如果你改变了assetSubDirectoryasset。路径变为asset/filename

环境变量

有时根据应用程序运行的环境具有不同的配置值是可行的。
类似

// config/prod.env.js
module.exports = {
  NODE_ENV: '"production"',
  DEBUG_MODE: false,
  API_KEY: '"..."' // this is shared between all environments
}

// config/dev.env.js
module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  DEBUG_MODE: true // this overrides the DEBUG_MODE value of prod.env
})

// config/test.env.js
module.exports = merge(devEnv, {
  NODE_ENV: '"testing"'
})

注释: 字符串变量需要'"..."'
综上,环境变量

Production
NODE_ENV = 'production',
DEBUG_MODE = false,
API_KEY = '...'
Development
NODE_ENV = 'development',
DEBUG_MODE = true,
API_KEY = '...'
Testing
NODE_ENV = 'testing',
DEBUG_MODE = true,
API_KEY = '...'

test.env 继承dev ,dev继承prod.env

使用

最简单的使用方法

Vue.config.productionTip = process.env.NODE_ENV === 'production'

于后端框架集成

如果你构建的是纯静态界面(没有端口api交互的),你就不需要编辑config/index.js.
然而你像集成这个模板到现有的后端框架中。你需要编辑config/index.js直接生成前段资源给后端。
默认的config/index.js

// config/index.js
'use strict'
const path = require('path')

module.exports = {
  dev: {
    / Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {},

    // Various Dev Server settings
    host: 'localhost',
    port: 8080, 

    // skipping other options as they are only convenience features
  },
  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',

    productionSourceMap: true,

    // skipping the rest ...
  },
}

在build的括号中,有这几个选项。
build.index

必须是当地文件系统中的绝对路径

这个是index.html自动生成的
你可以相应地编辑index.html并将此路径指向您的后端应用程序呈现的视图文件,
app/views/layouts/application.html.erb for a Rails app, or resources/views/index.blade.php for a Laravel app.

build.assetsRoot

也必须是绝对路径

必须指向包含静态资源的根目录
For example, public/ for both Rails/Laravel.
build.assetsSubDirectory
webpack生成器嵌套在build.assetsRoot文件夹中,其他文件不应该混合在一起。举个例子,如果build.assetsRoot/path/to/dist.build.assetsSubDirectorystatic。那么webpack 生成的资源就会在path/to/dist/static文件夹下。

这个目录会在每次build的时候清除。所以他应该只包含build生成的资源文件。

/static中的文件都在会构建时,拷贝到该目录。这意思是如果你改变了这个前缀所有在/static中绝对路径的URLs都需要改变。

build.assetsPublicPath
这应该是你的build.assetsRoot将通过HTTP提供的URL路径。 在大多数情况下,这将是根(/)。 只有在后端框架为路径前缀提供静态资产时才更改此设置。 在内部,这作为output.publicPath传递给Webpack。

build.productionSourceMap
是否在生产模式下生成资源映射

dev.port
指定开发端口号

dev.proxyTable
定义开发服务器的代理规则

在开发模式下的API代理

当需要集成当前模板到现有后台框架的时候。最常见的需求就是使用开发服务器请求后台API。为了这样,我们可以运行开发服务器和后台服务器,让开发服务器代理api请求到真正的后台服务器。

为了配置代理规则。编辑config/index.js中的dev.proxyTable.这个开发服务器是使用http-proxy-middleware
来代理。所以你可以查看文档来了解使用细节。这边有个简单的例子。

// config/index.js
module.exports = {
  // ...
  dev: {
    proxyTable: {
      // proxy all requests starting with /api to jsonplaceholder
      '/api': {
        target: 'http://jsonplaceholder.typicode.com',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
    }
  }
}

上面的例子会代理请求/api/posts/1http://jsonplaceholder.typicode.com/posts/1上面去。

URL 匹配

除了静态URL之外,您还可以使用全局模式来匹配网址,例如/ API/**。除此之外,你可以自定义方法来确定是否请求可以被代理。

proxyTable: {
  '**': {
    target: 'http://jsonplaceholder.typicode.com',
    filter: function (pathname, req) {
      return pathname.match('^/api') && req.method === 'GET'
    }
  }
}

单元测试

项目提供了2种单元测试。
1.Jest
2.Karma and Mocha

Jest

启动JSDOM的测试运行器运行测试并将结果报告给我们。

Files

setup.js
Jest在运行单元测试之前运行此文件。 它将Vue生产提示设置为false。

Mocking 依赖

Karma and Mocha

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 广州,温度:37℃,气压1001hpa。 党课在谈到考研,谈就业。风扇在呼呼吹着,课室比外面还热。总觉得,...
    YiZmi阅读 292评论 0 0