├── .babelrc
├── .github
└── workflows
│ └── nodejs.yml
├── .gitignore
├── README.md
├── SUMMARY.md
├── XIAOJI.md
├── package-lock.json
├── package.json
├── postcss.config.js
├── src
├── app.vue
├── assets
│ ├── images
│ │ ├── beijing.jpg
│ │ ├── bg.png
│ │ ├── checked.svg
│ │ └── unChecked.svg
│ └── styles
│ │ ├── footer.styl
│ │ ├── global.styl
│ │ ├── test-stylus.styl
│ │ └── test.css
├── index.js
└── todo
│ ├── footer.jsx
│ ├── header.vue
│ ├── item.vue
│ ├── tabs.vue
│ └── todo.vue
├── untitled.md
└── webpack.config.js
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "env"
4 | ],
5 | "plugins": [
6 | "transform-vue-jsx"
7 | ]
8 | }
9 |
10 | //转换vue中的jsx代码
11 | //npm i babel-preset-env@1.6.1 babel-plugin-transform-vue-jsx@3.5.0
12 | //npm i babel-helper-vue-jsx-merge-props@^2.0.0 babel-plugin-syntax-jsx@^6.8.0
--------------------------------------------------------------------------------
/.github/workflows/nodejs.yml:
--------------------------------------------------------------------------------
1 | name: Node CI
2 |
3 | on: [push]
4 |
5 | jobs:
6 | build:
7 |
8 | runs-on: ubuntu-latest
9 |
10 | strategy:
11 | matrix:
12 | node-version: [8.x, 10.x, 12.x]
13 |
14 | steps:
15 | - uses: actions/checkout@v1
16 | - name: Use Node.js ${{ matrix.node-version }}
17 | uses: actions/setup-node@v1
18 | with:
19 | node-version: ${{ matrix.node-version }}
20 | - name: npm install, build, and test
21 | run: |
22 | npm ci
23 | npm run build --if-present
24 | npm test
25 | env:
26 | CI: true
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Editor directories and files
9 | .idea
10 | *.suo
11 | *.ntvs*
12 | *.njsproj
13 | *.sln
14 | package-lock.json
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 一起读书
2 |
3 |
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Table of contents
2 |
3 | * [一起读书](README.md)
4 | * [Untitled](untitled.md)
5 | * [百度](https://baidu.com)
6 |
7 |
--------------------------------------------------------------------------------
/XIAOJI.md:
--------------------------------------------------------------------------------
1 | # CSS小记
2 |
3 | ## 1.opacity [CSS3属性]
4 | opacity 属性设置元素的不透明级别。
5 | 语法: opacity: value|inherit.
6 | 值|描述
7 | :--:|:--:
8 | value|规定不透明度。从 0.0 (完全透明)到 1.0(完全不透明)。
9 | inherit|应该从父元素继承 opacity 属性的值。
10 |
11 | ## 2.appearance [CSS3属性]
12 | appearance 属性允许您使元素看上去像标准的用户界面元素。
13 | 语法: appearance: normal|icon|window|button|menu|field;
14 | 值|描述
15 | :--:|:--:
16 | normal|将元素呈现为常规元素。
17 | icon|将元素呈现为图标(小图片)。
18 | window|将元素呈现为视口。
19 | button|将元素呈现为按钮。
20 | menu|将元素呈现为一套供用户选择的选项。
21 | field|将元素呈现为输入字段。
22 |
23 | 浏览器支持
24 | 所有主流浏览器都不支持 appearance 属性。
25 | Firefox 支持替代的 -moz-appearance 属性。
26 | Safari 和 Chrome 支持替代的 -webkit-appearance 属性。
27 |
28 | ## 3.disply: flex布局 justify-content
29 | [参考链接](http://www.runoob.com/try/playit.php?f=playcss_justify-content&preval=space-between)
30 |
31 | ## 4.font-smoothing 用于设置字体的抗锯齿或光滑度的属性。
32 | 它有三个属性值:
33 | none ------ 对低像素的文本比较好
34 | subpixel-antialiased------默认值
35 | antialiased ------抗锯齿很好
36 |
37 | # javaScript小记
38 | ## unshift()方法
39 | unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
40 | 语法: arrayObject.unshift(newelement1,newelement2,....,newelementX)
41 | 参数|描述
42 | :--:|:--:
43 | newelement1|必需。向数组添加的第一个元素。
44 | newelement2|可选。向数组添加的第二个元素。
45 | newelementX|可选。可添加若干个元素。
46 |
47 | 说明:unshift() 方法将把它的参数插入 arrayObject 的头部,并将已经存在的元素顺次地移到较高的下标处,以便留出空间。该方法的第一个参数将成为数组的新元素 0,如果还有第二个参数,它将成为新的元素 1,以此类推。
48 | 请注意,unshift() 方法不创建新的创建,而是直接修改原有的数组。
49 | 注释:该方法会改变数组的长度。
50 | 注释:unshift() 方法无法在 Internet Explorer 中正确地工作!
51 | 提示:要把一个或多个元素添加到数组的尾部,请使用 push() 方法。
52 |
53 | # vue小记
54 | ## 1.vue中$emit的用法
55 | 父组件可以使用 props 把数据传给子组件。
56 | 子组件可以使用 $emit 触发父组件的自定义事件。
57 |
58 |
59 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-webpack-todo",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "build": "cross-env NODE_ENV=production webpack --config webpack.config.js",
9 | "dev": "cross-env NODE_ENV=development webpack-dev-server --config webpack.config.js"
10 | },
11 | "author": "Jasonccj",
12 | "license": "ISC",
13 | "dependencies": {
14 | "autoprefixer": "^7.2.3",
15 | "babel-core": "^6.26.0",
16 | "babel-helper-vue-jsx-merge-props": "^2.0.0",
17 | "babel-loader": "^7.1.2",
18 | "babel-plugin-syntax-jsx": "^6.8.0",
19 | "babel-plugin-transform-vue-jsx": "^3.5.0",
20 | "babel-preset-env": "^1.6.1",
21 | "cross-env": "^5.1.3",
22 | "css-loader": "^0.28.7",
23 | "extract-text-webpack-plugin": "^3.0.2",
24 | "file-loader": "^1.1.6",
25 | "html-webpack-plugin": "^2.30.1",
26 | "i": "^0.3.6",
27 | "post": "0.0.1",
28 | "postcss-loader": "^2.0.9",
29 | "style-loader": "^0.19.1",
30 | "stylus": "^0.54.5",
31 | "stylus-loader": "^3.0.1",
32 | "url-loader": "^0.6.2",
33 | "vue": "^2.5.13",
34 | "vue-loader": "^13.6.0",
35 | "vue-template-compiler": "^2.5.13",
36 | "webpack": "^3.10.0",
37 | "webpack-dev-server": "^2.9.1"
38 | },
39 | "devDependencies": {}
40 | }
41 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | const autoprefixer = require('autoprefixer')
2 |
3 | module.exports = {
4 | plugins: [
5 | autoprefixer() //优化的过程通过一系列的组件进行优化,此次采用的是autoprefixer
6 | ]
7 | }
8 |
9 | //PostCss会对CSS代码进行优化,主要是解决不同浏览器识别码的问题,具体作用自行查阅
10 | //PostCss官网: https://www.postcss.com.cn/
11 | //-ms代表【ie】内核识别码
12 | //-moz代表火狐【firefox】内核识别码
13 | //-webkit代表谷歌【chrome】/苹果【safari】内核识别码
14 | //-o代表欧朋【opera】内核识别码
--------------------------------------------------------------------------------
/src/app.vue:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
23 |
24 |
42 |
--------------------------------------------------------------------------------
/src/assets/images/beijing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ccj/vue-webpack-todo/e5a0b875111594b342bd1cd6a083185b0eff416d/src/assets/images/beijing.jpg
--------------------------------------------------------------------------------
/src/assets/images/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ccj/vue-webpack-todo/e5a0b875111594b342bd1cd6a083185b0eff416d/src/assets/images/bg.png
--------------------------------------------------------------------------------
/src/assets/images/checked.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/images/unChecked.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/assets/styles/footer.styl:
--------------------------------------------------------------------------------
1 | #footer
2 | margin-top 40px
3 | text-align center
4 | color #bfbfbf
5 | font-size 10px
6 | text-shadow 0 1px 0 #ffffff
7 |
--------------------------------------------------------------------------------
/src/assets/styles/global.styl:
--------------------------------------------------------------------------------
1 | html, body
2 | margin 0
3 | padding 0
4 | width 100%
5 | height 100%
6 |
7 | body
8 | background-image url('../images/beijing.jpg')
9 | background-size cover
10 | background-position center
11 | font 14px 'microsoft yahei'
12 | color '#4d4d4d'
13 | font-weight 300
--------------------------------------------------------------------------------
/src/assets/styles/test-stylus.styl:
--------------------------------------------------------------------------------
1 | body
2 | font-size 20px
--------------------------------------------------------------------------------
/src/assets/styles/test.css:
--------------------------------------------------------------------------------
1 | body{
2 | color: red;
3 | background-image: url('../images/Yes-anxia.svg')
4 | }
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue' //引用vue类库
2 | import App from './app.vue'
3 |
4 | // import './assets/styles/test.css'
5 | // import './assets/styles/test-stylus.styl'
6 | // import './assets/images/bg.png'
7 | // 开发todo应用时用不到以上这些,故注释掉
8 |
9 | import './assets/styles/global.styl'
10 |
11 | const root = document.createElement('div') //创建div节点
12 | document.body.appendChild(root); //将div节点添加到body下
13 |
14 | new Vue({
15 | render: (h) => h(App)
16 | //vue在创建Vue实例时,通过调用render方法来渲染实例的DOM树,也就是这个组件渲染的是App的内容
17 | //vue在调用render方法时,会传入一个createElement函数作为参数,也就是这里的h的实参是createElement函数,然后createElement会以App为参数进行调用
18 | }).$mount(root) //挂载html的root节点下面
--------------------------------------------------------------------------------
/src/todo/footer.jsx:
--------------------------------------------------------------------------------
1 | import '../assets/styles/footer.styl'
2 |
3 | export default {
4 | data(){
5 | return{
6 | author: 'Jasonccj'
7 | }
8 | },
9 | render(){
10 | return (
11 |
14 | )
15 | }
16 | }
--------------------------------------------------------------------------------
/src/todo/header.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
16 |
--------------------------------------------------------------------------------
/src/todo/item.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
11 |
12 |
13 |
28 |
29 |
84 |
--------------------------------------------------------------------------------
/src/todo/tabs.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{unFinishedTodoLength}} items left
4 |
5 |
11 | {{state}}
12 |
13 |
14 | Clear completed
15 |
16 |
17 |
18 |
50 |
51 |
83 |
84 |
85 |
--------------------------------------------------------------------------------
/src/todo/todo.vue:
--------------------------------------------------------------------------------
1 |
2 |
23 |
24 |
25 |
72 |
73 |
97 |
98 |
99 |
--------------------------------------------------------------------------------
/untitled.md:
--------------------------------------------------------------------------------
1 | # Untitled
2 |
3 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path') //path是Nodejs中的基本包,用来处理路径
2 | const HTMLPlugin = require('html-webpack-plugin') //引入html-webpack-plugin
3 | const webpack = require("webpack") //引入webpack
4 | const ExtractPlugin = require("extract-text-webpack-plugin")
5 |
6 | const isDev = process.env.NODE_ENV === "development" //判断是否为测试环境,在启动脚本时设置的环境变量都是存在于process.env这个对象里面的
7 |
8 | const config = {
9 | target: "web", //设置webpack的编译目标是web平台
10 | entry: path.join(__dirname,'src/index.js'), //声明js文件入口,__dirname就是我们文件的根目录,用join拼接
11 | output:{ //声明出口文件
12 | filename: 'bundle.js', //将挂载的App全部打包成一个bundle.js,在浏览器中可以直接运行的代码
13 | path: path.join(__dirname,'dist') //bundle.js保存的位置
14 | },
15 | module:{ //因为webpack只能处理js文件,且只识别ES5的语法
16 | rules:[ //所以针对不同类型的文件,我们定义不同的识别规则,最终目的都是打包成js文件
17 | {
18 | test: /\.vue$/,
19 | loader: 'vue-loader' //处理.vue文件
20 | },
21 | {
22 | test: /\.jsx$/,
23 | loader: 'babel-loader' //处理jsx文件
24 | },
25 | // {
26 | // test: /\.css$/,
27 | // use: [
28 | // 'style-loader', //将css的样式写入到html里面去
29 | // 'css-loader' //处理css文件
30 | // ]
31 | // },
32 | {
33 | test: /\.(gif|jpg|jpeg|png|svg)$/, //处理图片
34 | use: [
35 | { //loader是可以配置选项的,如下options
36 | loader: 'url-loader', //url-loader实际上依赖于file-loader,file-loader处理完文件可以保存为一个文件供处理
37 | options: {
38 | limit: 1024, //url-loader的好处是可以加一个限制的大小,对于小图片,在范围内可直接将图片转换成base64码直接存放在js中,以减少http请求.
39 | name: '[name].[ext]' //输出文件的名字,[name] 文件原名,[ext]文件扩展名.
40 | }
41 | }
42 | ]
43 | }
44 | ]
45 | },
46 | plugins:[
47 | new webpack.DefinePlugin({ //主要作用是在此处可以根据isdev配置process.env,一是可以在js代码中可以获取到process.env,
48 | 'process.env':{ //二是webpack或则vue等根据process.env如果是development,会给一些特殊的错误提醒等,而这些特殊项在正式环境是不需要的
49 | NODE_ENV: isDev ? '"development"' : '"production"'
50 | }
51 | }),
52 | new HTMLPlugin() //引入HTMLPlugin
53 | ]
54 | }
55 |
56 | if(isDev){
57 | config.module.rules.push(
58 | {
59 | test: /\.styl/,
60 | use: [
61 | 'style-loader', //将css写入到html中去
62 | 'css-loader', //css-loader处理css
63 | {
64 | loader: 'postcss-loader',
65 | options: {
66 | sourceMap: true, //stylus-loader和postcss-loader自己都会生成sourceMap,如果前面stylus-loader已生成了sourceMap
67 | } //那么postcss-loader可以直接引用前面的sourceMap
68 | },
69 | 'stylus-loader' //处理stylus的css预处理器的问题件,转换成css后,抛给上一层的css-loader
70 | ]
71 | }
72 | ) //如果是测试环境下的一些配置
73 | config.devtool = '#cheap-module-eval-source-map' //官方推荐使用这个配置,作用是在浏览器中调试时,显示的代码和我们的项目中的代码会基本相似,而不会显示编译后的代码,以致于我们调试连自己都看不懂
74 | config.devServer = { //这个devServer的配置是在webpack2.x以后引入的,1.x是没有的
75 | port: 8000, //访问的端口号
76 | host: '127.0.0.1', //可以设置0.0.0.0 ,这样设置你可以通过127.0.0.1或则localhost去访问
77 | overlay: {
78 | errors: true, //编译中遇到的错误都会显示到网页中去
79 | },
80 | // open: true , //项目启动时,会默认帮你打开浏览器
81 | hot: true //在单页面应用开发中,我们修改了代码后是整个页面都刷新,开启hot后,将只刷新对应的组件
82 | },
83 | config.plugins.push( //添加两个插件用于hot:true的配置
84 | new webpack.HotModuleReplacementPlugin(),
85 | new webpack.NoEmitOnErrorsPlugin()
86 | )
87 | } else{
88 | config.entry = {
89 | app: path.join(__dirname,'src/index.js'),
90 | vendor: ['vue']
91 | }
92 | config.output.filename = '[name].[chunkhash:8].js' //此处一定是chunkhash,因为用hash时app和vendor的hash码是一样的了,这样每次业务代码更新,vendor也会更新,也就没有了意义.
93 | config.module.rules.push(
94 | {
95 | test: /\.styl/,
96 | use: ExtractPlugin.extract({
97 | fallback: 'style-loader',
98 | use: [
99 | 'css-loader', //css-loader处理css
100 | {
101 | loader: 'postcss-loader',
102 | options: {
103 | sourceMap: true, //stylus-loader和postcss-loader自己都会生成sourceMap,如果前面stylus-loader已生成了sourceMap
104 | } //那么postcss-loader可以直接引用前面的sourceMap
105 | },
106 | 'stylus-loader' //处理stylus的css预处理器的问题件,转换成css后,抛给上一层的css-loader
107 | ]
108 | })
109 | },
110 | ),
111 | config.plugins.push(
112 | new ExtractPlugin('styles.[contentHash:8].css'), //定义打包分离出的css文件名
113 | new webpack.optimize.CommonsChunkPlugin({ //定义静态文件打包
114 | name: 'vendor'
115 | }),
116 | new webpack.optimize.CommonsChunkPlugin({ //将app.js文件中一些关于webpack文件的配置单独打包出为一个文件,用于解决部分浏览器长缓存问题
117 | name: 'runtime'
118 | })
119 | )
120 | }
121 |
122 | module.exports = config //声明一个config的配置,用于对外暴露
--------------------------------------------------------------------------------